Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.10.2009, 21:54   #1
сон
 
Регистрация: 13.03.2009
Сообщений: 4
Восклицание интерполяция методом Лагранжа (синус)

нужно методом Лагранжа за 101 шаг вычислить синус х из [0,1].
прога работает корректно, если дробная часть не переходит за границы тысячных. т.е. если ввести 0,5 или 0,05, то даст верный рез-тат, а если например 0,005, то подсчет неверен.
внимание вопрос: почему?)
Код:
#include <stdio.h>
#include <math.h>
#include <stdlib.h>

int main (void)
{
	double x, pro, h = 0.01, s = 0.0;
	int i, j;
	double *a, *b;
	
	printf ("enter x: "); scanf ("%lf", &x);
	a = (double*)malloc(101*sizeof(double));
	b = (double*)malloc(101*sizeof(double));
	
	for (i=0; i<=100; i++)	{
		a[i]=i*h;
		b[i]=sin(a[i]);
		}
		
	for (i=0; i<=100; i++)	{
		pro = 1;
		/* вычисление ф-ии Лагранжа */
		for(j=0;j<=100;j++)	if(i!=j) pro*=(x-a[j])/(a[i]-a[j]);
		s+=pro*b[i];
		}
		
	printf("answer is %lg \nsinus is %lg \ndifference is %lg", s, sin(x), (sin(x)-s));
	return 0;
}
рез-тат работы:
Код:
C:\Documents and Settings\user>a
enter x: 0.5
answer is 0.479426
sinus is 0.479426
difference is 0
C:\Documents and Settings\user>a
enter x: 0.05
answer is 0.0499792
sinus is 0.0499792
difference is 0
C:\Documents and Settings\user>a
enter x: 0.005
answer is -7.22152e+010
sinus is 0.00499998
difference is 7.22152e+010

Последний раз редактировалось сон; 18.10.2009 в 21:57. Причина: уточнение проблемы)
сон вне форума Ответить с цитированием
Старый 19.10.2009, 01:04   #2
nazavrik
Форумчанин
 
Аватар для nazavrik
 
Регистрация: 01.09.2008
Сообщений: 178
По умолчанию

Маллок обязательно использовать? Реализация через массивы не подойдет?
Быть радикальным - значит понять вещь в её корне. К.Маркс

Последний раз редактировалось nazavrik; 19.10.2009 в 01:19.
nazavrik вне форума Ответить с цитированием
Старый 19.10.2009, 01:47   #3
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Цитата:
Сообщение от nazavrik Посмотреть сообщение
Маллок обязательно использовать? Реализация через массивы не подойдет?
А разве это принципиально?) Какая разница где размещать массив - в стеке, или в куче?

2сон,
Очевидно недочёт алгоритма, если изменить h на 0.001, то считает правильно для х=0.005, 0.05, но неправильно для 0.5 и так далее...
netrino вне форума Ответить с цитированием
Старый 19.10.2009, 10:08   #4
nazavrik
Форумчанин
 
Аватар для nazavrik
 
Регистрация: 01.09.2008
Сообщений: 178
По умолчанию

Цитата:
Сообщение от netrino Посмотреть сообщение
А разве это принципиально?) Какая разница где размещать массив - в стеке, или в куче?
Не принципиально, но у меня есть готовый код через массивы.
Быть радикальным - значит понять вещь в её корне. К.Маркс
nazavrik вне форума Ответить с цитированием
Старый 19.10.2009, 13:15   #5
сон
 
Регистрация: 13.03.2009
Сообщений: 4
По умолчанию

Цитата:
Маллок обязательно использовать? Реализация через массивы не подойдет?
маллок обязательно, все что есть должно остаться.

Цитата:
Очевидно недочёт алгоритма, если изменить h на 0.001, то считает правильно для х=0.005, 0.05, но неправильно для 0.5 и так далее...
такой вариант предлагался, но жестоко обозван глупостью((
менять ничего не надо, нужно просто теоретически объяснить по какой причине так выходит.
сон вне форума Ответить с цитированием
Старый 19.10.2009, 17:20   #6
valeologiya
Пользователь
 
Регистрация: 07.07.2009
Сообщений: 37
По умолчанию

Цитата:
Сообщение от netrino Посмотреть сообщение
если изменить h на 0.001, то считает правильно для х=0.005, 0.05, но неправильно для 0.5 и так далее...
Если изменить h на 0.001, то интерполяционный многочлен будет определен только до 0,1 судя по
Код:
	for (i=0; i<=100; i++)	{
		a[i]=i*h;
		b[i]=sin(a[i]);
		}
То есть до 0,1 он будет идти по точкам, а дальше как уж сложилось... Чем дальше от 0.1, тем хуже. В точке 0.5 он, естесственно не будет совпадать с синусом. Но отклонения должны быть не гигантскими. Так получается?

Если шаришь в маткаде, а лучше в матлабе, попробуй забей свой метод и построй получающийся график для x=0.005. Может быть у тебя реально в этой точке такой горб получается? Вот тут: http://ru.wikipedia.org/wiki/%D0%9C%...BD%D0%B6%D0%B0 между зеленой и желтой точкой тоже горб. Может он у тебя просто побольше?

А, можно попробовать изменить точность на 0.001 и определить интермногочлен побольше. Но тогда не 100, а 1000 итераций будет.

Если нет времени мудиться, отвечай что горб, авось угадаем

Последний раз редактировалось valeologiya; 19.10.2009 в 17:27.
valeologiya вне форума Ответить с цитированием
Старый 09.11.2009, 11:02   #7
krink
Новичок
Джуниор
 
Регистрация: 09.11.2009
Сообщений: 1
По умолчанию

Полином какой степени у Вас получается? 101? Попробуй массивы не от 0 до 100, а например от 0 до 5.
Ну а ответ получается точным если значение точки не выходит за пределы сотых из-за того, что у Вас точки в массиве посчитаны до сотых, а многочлен принимает значение функции в заданных точках, т.е. в пределах сотых у вас всегда будет 100% точный результат.

Код:
#include <stdio.h>
#include <math.h>
#include <stdlib.h>

int main (void)
{
	double x, pro, s = 0.0;
	int i, j;
	double *a, *b;
	
	printf ("enter x: "); scanf ("%lf", &x);
	a = (double*)malloc(6*sizeof(double));
	b = (double*)malloc(6*sizeof(double));
	
	for (i=0; i<=5; i++)	{
		a[i]=(double)i/5;
		b[i]=sin(a[i]);
		}
		
	for (i=0; i<=5; i++)	{
		pro = 1;
		/* вычисление ф-ии Лагранжа */
		for(j=0;j<=5;j++)	if(i!=j) pro*=(x-a[j])/(a[i]-a[j]);
		s+=pro*b[i];
		}
		
	printf("answer is %lg \nsinus is %lg \ndifference is %lg", s, sin(x), (sin(x)-s));
	return 0;
}

Последний раз редактировалось krink; 09.11.2009 в 11:27.
krink вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Интерполяция по схеме Эйткена Gonzo Помощь студентам 4 23.03.2015 18:25
Формула Лагранжа Diablo221 Помощь студентам 3 16.05.2009 20:56
линейная интерполяция Auster Помощь студентам 4 22.04.2008 18:02