2014 dxdy logo

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

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




Начать новую тему Ответить на тему
 
 Интерполяция Лагранжа
Сообщение13.10.2013, 11:39 


22/06/12
417
Добрый день! Помогите пожалуйста найти ошибку в программе, битый день делаю, я новичок, но как мне кажется очень логично написал код. Программа работает, но по непонятной причине выдаёт повторяющиеся значения. Где могла закрасться ошибка
задание: построить интерполяционный полином Лагранжа для функции $$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 
Заслуженный участник
Аватара пользователя


06/10/08
6422
Вы переменную P не устанавливаете в единицу на каждой итерации, там старое значение остается.

 Профиль  
                  
 
 Re: Интерполяция Лагранжа
Сообщение13.10.2013, 14:01 


22/06/12
417
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 


22/06/12
417
А всё! смог разобраться в чём дело! еще раз спасибо!

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 4 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group