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

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить
illuminates
Сообщения: 1
Зарегистрирован: 13 окт 2013, 06:59

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

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

Код: Выделить всё

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);
}
Изображение
Аватара пользователя
WinMain
Сообщения: 929
Зарегистрирован: 14 янв 2005, 10:30
Откуда: Москва
Контактная информация:

X[j]=a+j*(b-a)/9;
Поскольку арифметические действия производятся над целыми числами, то в значение X[j] будет записана только целая часть числа без дроби.

Нужно написать так:

X[j]= (double)a + (double)j*(b-a)/9;

Далее...

double X[9], Nevyazka[9];

for (short j=0; j<=9; j++)
{
...
}
Происходит выход за границы массива.

исправь:
for (short j=0; j < 9; j++)
...
Ответить