Top.Mail.Ru
Ответы

Помогите пожалуйста с программированием определенного интеграла в Паскале(методом прямоугольников)

Вот программный код:
Program Integral;
type func=function(x:real):real;
Var a,b:real;n:integer;
{$F+}
function f1(x:real):real;
Begin
f1:=x*(exp(ln(1+x)/3 ));
End;
{$F-}
Function integ(a,b:real;n:integer;f:func):real;
Var s,h,x:real;i:integer;
Begin
h:=(b-a)/n;
s:=0;
For i:=1 to n do
s:=s+h*f(a+i*h);
integ:=S;
End;
Begin {main}
readln(a,b,n);
writeln(itnteg(a,b,n,f1):7:4);
readln;
End.
Программа работает но считает интеграл неверно
пределы интегрирования - от 8 до 1, использую метод прямоугольников)
В проге a,b -пределы интегрирования, n - число разбиений, h-шаг.
И да еще если не сложно, можете помочь посчитать этот интеграл с заданной точностью( я видел готовую блок-схему там вроде нужно использовать цикл for, но для чего все это я так и не понял).
Заранее спасибо!!!

Дополнен

Хулиганов Иосиф

Я без понятия какой мне метод нужен на лекции говорилось просто про метод прямоугольников.
Так что пусть будет метод правых прямоугольников. То что функция не определена при x<=-1 мне не особо нужно - т. к. пределы интегрирования от 8 до 1. Когда я эту прогу компилирую и запускаю, то при числе разбиений =1000 ответ примерно 57 (когда по формуле Ньютона-Лейбница ответ получается в районе 20).
Сравнивал программный код с тем что давали на лекции - все сделано абсолютно одинаково

По дате
По рейтингу
Аватар пользователя
Новичок
14лет

По формуле Ньютона-Лейбница ответ приблизительно -57.8981
Wolfram Alpha

Либо ты интеграл неправильно взял, либо подынтегральную функцию в программе неправильно записал.
Так что программа даёт правильный ответ (и выглядит правильно) .

Чтобы вычислить с заданной точностью, нужно вместо n получать от пользователя требуемую точность (например, переменная dS). В функции integ() нужно определить n:=1 и S_prev:=0, а твой цикл for поместить внутрь цикла repeat ...until, который вычисляет интеграл S с числом разбиений n, запоминает ответ в переменную S_prev:=S и делает n:=n*2. Цикл repeat ...until должен продолжаться до тех пор пока не выполнится abs(S-S_prev)/abs(S+S_prev)<=dS.

Аватар пользователя
Искусственный Интеллект
14лет

Твоя функция не определена при x <=-1. Кроме того, существуют три модификации метода прямоугольников: левых, правых и средних. Последний имеет точность более высокого порядка, чем первый и второй. Тебе какой нужен?
У тебя реализован метод правых прямоугольников - первого порядка точности.
Для вычисления интеграла с заданной точностью используется метод двойного просчета (Рунге) :
|I_n - I_2n|/(2^k-1) < e.
I_n - интеграл с n разбиениями отрезка интегрирования
I_2n - интеграл с 2n разбиениями отрезка интегрирования
k - порядок точности (у тебя k=1)
e - допустимая погрешность.