Помощь - Поиск - Пользователи - Календарь
Полная версия: вычислить интеграл методом симпсона
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Ven
Надо вычислить интеграл методом симпсона

пример взяла с этого форума, всё работает,вот только в ответ выводит 2, а в он-лайн подсчете интеграла на стороннем сайте ответ= -6.. где ошибка?))помогите разобраться)


program Simpson;
uses crt;
{integriruemaya funkciya}
function F(x:Real):Real;


begin

F:=exp(2*sin(x)) * sin(5 + 2* cos(x) );
end;

var a,b,h,x: real;
i,l,n: integer;
integ: real;
begin
clrscr;
{interval integrirovaniya}

a:=0;
b:=2*pi;

{osnovnaya programma}

write ('Vvedite kolichestvo razbieniy intervala (chetnoe) n= '); readln(n);
if (n mod 2) > 0 then
begin
n:=n+1;
writeln('Chislo n bilo vvedeno nechetnoe i bilo zameneno na n=',n);
end;
h:=(b-a)/n;
integ:=F(a)+F(b)+4*F(a+h);
for i:=1 to (n div 2 ) -1 do
begin

x:=a+2*h*i;
integ:=integ + 2*F(x) + 4*F(x+h);
end;
integ:=h*integ/3;

l:=round(-ln(integ)/ln(10));

writeln('Integral= ',integ:l:l);
readln;
end.




там в конце строчка integ:=h*integ/3;

к чему она? так было в примере решения..
IUnknown
Цитата
вот только в ответ выводит 2, а в он-лайн подсчете интеграла на стороннем сайте ответ= -6.. где ошибка?))помогите разобраться)
Вот только почему-то:
Vvedite kolichestvo razbieniy intervala (chetnoe) n= 20
Integral= -6.025666

Где взят результат = 2 непонятно совершенно. Кстати, твой метод подсчета L вылетает тут моментально, при попытке взять логарифм отрицательного числа, поэтому пришлось заменить на обычный:
 writeln('Integral= ',integ:10:6);


Цитата
там в конце строчка integ:=h*integ/3;
к чему она?
К алгоритму.
Ven
я вводила n = 2, там какое-то определенное число разбиений должно быть?
Krjuger
Ответ верный,просто чем больше разбиений,тем более точный ответ ты получиш, поставь числа 10, 20 и тд, и увидиш что они будут приближаться к -6.А начальное приближение всегда будет ужасным,зато скорость сходимости очень хорошая.
Ven
Всё, я поняла,если подставить какую-нибудь простую функцию и пределы интегрирования- всё верно считает... извиняюсь что сразу не проверила.. А вот препод сказал что еще обязательно должна быть точность (вводить тоже надо самому).. я не поняла как это сделать..кто-нибудь может "чайнику" объяснить?
Krjuger
Ну для начала ты должна посчитать точное значение, затем ты сравниваеш точное значение с значением,полученным при n=2,если не удовлетворяет твоей точности,то увеличиваеш n на 2 и пересчитываеш симпсона и так до тех пор пока не получишь ответ,но тут есть маленькая тонкость,как и у любого другого метода,есть функции для которых метод расходится и заданную точность невозможно достигнуть,в таком случае нужно поставить какое нибудь естественно ограничение,например n=1000,и если ответ за это время не был получен,то вывести соответствующее сообщение.
botinnoK
Цитата(Krjuger @ 21.10.2011 17:04) *

Ну для начала ты должна посчитать точное значение, затем ты сравниваеш точное значение с значением,полученным при n=2,если не удовлетворяет твоей точности,то увеличиваеш n на 2 и пересчитываеш симпсона и так до тех пор пока не получишь ответ,но тут есть маленькая тонкость,как и у любого другого метода,есть функции для которых метод расходится и заданную точность невозможно достигнуть,в таком случае нужно поставить какое нибудь естественно ограничение,например n=1000,и если ответ за это время не был получен,то вывести соответствующее сообщение.

всем привет нужна помощь решить интеграл методом симпсона фунция=x*x a=1 b=3 пробывал по вашей проге не получается в вашу прогу вставлял функцию и пределы на экране появлялся запрос ввести n ввожу 20 и все вылетает
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.