2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




 
 Интерполяция Лагранжа
Сообщение13.10.2013, 11:39 
Добрый день! Помогите пожалуйста найти ошибку в программе, битый день делаю, я новичок, но как мне кажется очень логично написал код. Программа работает, но по непонятной причине выдаёт повторяющиеся значения. Где могла закрасться ошибка
задание: построить интерполяционный полином Лагранжа для функции $$f(x) = 4x - 7 \sin x$$ на интервале [-2, 3], количество точек, в которых определена функция m = 4. Таблица исходной фунции вычисляется в точках $$x_i = -2 - i5/m$$, i = 0,...,m. Используя полученную таблицу требуется вычислить значения функции, полинома и невязки в точках $$x_j = -2 - j5/9$$, j = 0,...,9.

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

Код:
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);
}


Изображение

 
 
 
 Re: Интерполяция Лагранжа
Сообщение13.10.2013, 13:24 
Аватара пользователя
Вы переменную P не устанавливаете в единицу на каждой итерации, там старое значение остается.

 
 
 
 Re: Интерполяция Лагранжа
Сообщение13.10.2013, 14:01 
Xaositect
Да действительно.Спасибо. Поставил 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];
        }       

Но вместо долгожданной верной работы, работает совсем не верно. Теперь я совершено ничего уже не понимаю.

Изображение

 
 
 
 Re: Интерполяция Лагранжа
Сообщение13.10.2013, 15:17 
А всё! смог разобраться в чём дело! еще раз спасибо!

 
 
 [ Сообщений: 4 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group