Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
3 / 3 / 0
Регистрация: 09.11.2024
Сообщений: 48

Метод интерполяции Эрмита и полинома Лагранжа

01.04.2026, 06:05. Показов 449. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. Делаю метод интерполяции Эрмита для нахождения точки по функции. Есть проблема в том, что мой метод банально пропускает один из этапов.
То есть должно быть как то так:
L0 = 0.375; Dl0 = -1
L1 = 0.75; Dl1 = 0
L2 = -0.125; Dl2 = 1

Но у меня получается так, что
L1 и L2 перемешиваются L1 = 0.75 Dl1 = 1 L2= -0.125 Dl2 = 0

Получается вместо H(x) = -14.98.. выдается ответ H(x) = -24.73...
Спрашивал у того же ИИ, он ошибок ни в расчетах ни в коде не нашел, ссылаясь на внешние ошибки в записи, хотя их нет и другие методы работают исправно. Может тут мне обьяснят и укажат на ошибку.
Код:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
 double f(double X)
 {
     return Math.Pow(X, 3) + 3 * Math.Pow(X, 2) - 24 * X +10;
 }
 
 
 //Для Эрмита
 double df(double x)
 {
     return 3 * (x * x) + 6 * x - 24;
 }
 
 //Полином Лагранжа
 double Lag(int i, double[]X, double x)
 {
     int n = X.Length;
     double result = 0;
     for (int k = 0; k < n; k++)
     {
         if (k == i) continue;
         double term = 1;
         for (int j = 0; j < n; j++)
         {
             if (j == i || j == k) continue;
             
                 
                term *= (x - X[j]) / (X[i] - X[j]);
             
         }
         result += term/(X[i] - X[k]);
     }
 
     return result;
 }
 
 
 double Ermith( double[] xar, double[] yar, double[] dyar, double x)
 {
     int n = xar.Length;
     double result = 0;
 
     for (int i = 0; i < n; i++)
     {
         double Li = 1;
         double dLi = 0;
 
         for (int j = 0; j < n; j++)
         {
             if (j != i)
                 Li *= (x - xar[j]) / (xar[i] - xar[j]);
         }
 
         //for (int j = 0; j < n; j++)
         //{
         //    if (j != i)
         //    {
         //        double term = 1 / (xar[i] - xar[j]);
 
         //        for (int k = 0; k < n; k++)
         //        {
         //            if (k != i && k != j)
         //                term *= (x - xar[k]) / (xar[i] - xar[k]);
         //        }
 
         //        dLi += term;
         //    }
         //}
 
         dLi = Lag(i, xar, x);
 
 
         double Hi = (1 - 2 * (x - xar[i]) * dLi) * Li * Li;
         double Ki = (x - xar[i]) * Li * Li;
 
         result += Hi * yar[i] + Ki * dyar[i];
     }
 
     return result;
 }
 
 private void buttonX_Click(object sender, EventArgs e)
 {
         double x = double.Parse(Xpoint.Text, CultureInfo.InvariantCulture); //Current Culture чтобы понимал 1,5 вместо 1.5  //теперь не работает после обновления. Непонятно почему
         double[] Xnodes = Xn.Text.Split(',').Select(v=>double.Parse(v.Trim(),CultureInfo.InvariantCulture)).ToArray();
         double[] Ynodes = Yn.Text.Split(',').Select(v => double.Parse(v.Trim(), CultureInfo.InvariantCulture)).ToArray();
        
        //....
 
 
         ....//
 
//Эрмит
 
     double[] Dy = Xnodes.Select(xi => df(xi)).ToArray();
     double E = Ermith(Xnodes, Ynodes, Dy, x);
     ResultX.Text = $"Сплайн= {Sx}\r\n" + $"Функция = {Fx}\r\n" + $"Погрешность= {Math.Abs(Sx - Fx):F6}\r\n" + $"Эрмит ={E:F6}\r\n" + $"Погрешность Эрмита = {Math.Abs(E - Fx):F6}\r\n";
 }
Скриншот с получившимися ответами и вводимыми данными:
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
01.04.2026, 06:05
Ответы с готовыми решениями:

Как реализовать формулу погрешности интерполяции полинома Лагранжа?
Здраствуйте, недавно защищал лабараторную на тему &quot;полином лагранджа&quot; и в какой-то момент препод...

Итерации - реализация интерполяции Лагранжа
Здравствуйте. Дали задание реализовать интерполяционную формулу Лагранжа(на рисунке ниже). Так...

Интерполяция полинома Лагранжа: подробно разобрать код
1.Подходит ли такой код? 2.Обясните пожалуйста на пальцах смысл самого метода,для чего он...

1
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3439 / 2759 / 575
Регистрация: 04.09.2018
Сообщений: 8,660
Записей в блоге: 3
01.04.2026, 13:14
KindHiros, почему должно быть -14.98 ? У меня код малость другой, но тоже считает: H(x) = -24.734375
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
01.04.2026, 13:14
Помогаю со студенческими работами здесь

Кривая Эрмита
Дорогие друзья, я пытаюсь нарисовать кривую Эрмита, не все точки соединяются между собой....

Интерполяция полиномами Лагранжа
Здравствуйте. Помогите пожалуйста. В С# требуется реализовать программу интерполяции полиномами...

Реализовать алгоритм восстановления функции, используя интерполяционый полином Лагранжа
задача звучит так - &quot;реализовать алгоритм восстановления функции, используя интерполяционый полином...

Кусочно-квадратичная интерполяция, полином Лагранжа
Ребятааа, выручайте! Помогите, пожалуйста, написать программу по кусочно-квадратичной интерполяции,...

Кусочно-квадратичная интерполяция C#, полином Лагранжа
Помогите, пожалуйста, написать программу по кусочно-квадратичной интерполяции, полином Лагранжа....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 05.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 03.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru