Форум программистов, компьютерный форум CyberForum.ru

Интерполяция Лагранжа - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 17, средняя оценка - 4.88
illuminates
1 / 1 / 0
Регистрация: 14.06.2012
Сообщений: 98
13.10.2013, 15:01     Интерполяция Лагранжа #1
Добрый день! Помогите пожалуйста найти ошибку в программе, битый день делаю, я новичок, но как мне кажется очень логично написал код. Программа работает, но по непонятной причине выдаёт повторяющиеся значения. Где могла закрасться ошибка
задание: построить интерполяционный полином Лагранжа для функции f(x) = 4x - 7sinx на интервале [-2, 3], количество точек, в которых определена функция m = 4. Таблица исходной фунции вычисляется в точках x_i = -2 - i*5/m, i = 0,...,m. Используя полученную таблицу требуется вычислить значения функции, полинома и невязки в точках x_j = -2 - j*5/9, j = 0,...,9.

получилась программа:

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
double lagrange(double _x);
double func(double _x);
int main( void )
{
  setlocale(LC_ALL, "Russian");
  int a=-2, b=3, m=4;
  double X[9], Nevyazka[9];
 
 
    for (short j=0; j<=9; j++)
    {
        X[j]=a+j*(b-a)/9;
        Nevyazka[j]=fabs(lagrange(X[j])-func(X[j]));
        cout<<"f(X"<<j<<")="<<func(X[j])<<";\t"<<"L(X"<<j<<")="<<lagrange(X[j])<<";\t"<<"Невязка  "<<Nevyazka[j]<<";\n";
    }
 
        getch();    
    return (0);
}
 
 
 
double lagrange(double _x)
{
        double L = 0, P = 1, x[5], y[5];
        int a=-2, b=4;
        short n=4;
        //double x[5] = {-2, -0.75, 0.5, 1.75, 3};
        //double y[5] = {-1.64, 1.77, -1.36, 0.11, 11.01};
        for (short i = 0; i < n; i++)
        {
            x[i]=a+(i*(b-a))/n;
            y[i]=4*x[i]-7*sin(x[i]);
        }
 
        for (short i = 0; i < n; i++)
        {    
            for (short j = 0; j < n; j++)
                {
                 if (j - i)
                 P *= (_x - x[j])/ (x[i] - x[j]);
                 }
             L += P * y[i];
        }       
 
        return L;
}
 
double func(double _x)
{
    return 4*_x-7*sin(_x);
}
http://img14.imageshack.us/img14/4338/bgix.png

Добавлено через 2 часа 28 минут
Поставил P=1 в подфункции:
Код
 for (short i = 0; i < n; i++)
        {   
         double P = 1;
         for (short j = 0; j < n; j++)
            {
             if (j - i)
                 P *= (_x - x[j])/ (x[i] - x[j]);
              }
             L += P * y[i];
        }
Но вместо долгожданной верной работы, работает совсем не верно. Теперь я совершено ничего уже не понимаю.

http://img191.imageshack.us/img191/779/zh23.png
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
13.10.2013, 15:22     Интерполяция Лагранжа #2
Цитата Сообщение от illuminates Посмотреть сообщение
j*(b-a)/9
C++
1
j*(b-a)/9.0
Добавлено через 1 минуту
Цитата Сообщение от illuminates Посмотреть сообщение
y[i]=4*x[i]-7*sin(x[i]);
y[i]=func(x[i])

Добавлено через 2 минуты
Цитата Сообщение от illuminates Посмотреть сообщение
for (short i = 0; i < n; i++)
* * * * { * *
* * * * * * for (short j = 0; j < n; j++)
* * * * * * * * {
* * * * * * * * *if (j - i)
* * * * * * * * *P *= (_x - x[j])/ (x[i] - x[j]);
* * * * * * * * *}
* * * * * * *L += P * y[i];
* * * * }
C++
1
2
3
4
5
6
7
8
for (short i = 0; i < n; i++){
  P=1.0;
  for (short j = 0; j < n; j++){
    if (j - i)
      P *= (_x - x[j])/ (x[i] - x[j]);
  }
  L += P * y[i];
 }
illuminates
1 / 1 / 0
Регистрация: 14.06.2012
Сообщений: 98
13.10.2013, 16:16  [ТС]     Интерполяция Лагранжа #3
Kuzia domovenok, Вы гений СИ++!!! Благодарю!
Kuzia domovenok
13.10.2013, 21:39     Интерполяция Лагранжа
  #4

Не по теме:

Цитата Сообщение от illuminates Посмотреть сообщение
Благодарю!
для "благодарю" кнопка есть

Yandex
Объявления
13.10.2013, 21:39     Интерполяция Лагранжа
Ответ Создать тему
Опции темы

Текущее время: 13:53. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru