|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
||||
|
||||
Интегрирование методом трапеций
Добрый вечер, господа!=)
Очень давно не писал на паскале/дельфине, а тут попросили знакомые помочь с интегрированием. Сам никогда мат. частью задач не занимался, а тут такой нежданчик=( Сам алгоритм нашел, но работает он на мой взгляд не очень верно. Код:
program Project2; {$APPTYPE CONSOLE} uses SysUtils; var A, B, S, h, integ:REAL; n,i:integer; function f(x:real):real; begin f := 2.46573; end; begin a:=0; b:=100; n:=0.1; h := (b - a) / n; for i := 1 to n-1 do begin S := S + f(a + h * i); end; integ := h * ( ( f(a) + f(b) ) / 2 + S); writeln(integ:0:4); Readln; end. В цикле сумма не меняется, шаг интегрирования по заданию 0.1, а здесь целочисленный вообще. Возвращаемое значение от ф-ии f() взял для наглядности, возвращаемое значение интеграла по заданию для него должно быть 231.63661. Задание лежит вот тут, тема 4, задание 2, вариант 2. Методичка тут, но в ней только сама формула. Ребят, извините пожалуйста, что вот так вот все криво, просто сейчас запар на работе и по другому не получается=( Заранее спасибо. Алкоголик-аморал, явная угроза обществу Блин, я уже местный, а все равно нифига не знаю... |
#2
|
||||
|
||||
И что возвращает функция f:
Код:
function f(x:real):real; begin f := 2.46573; end ... S := S + f(a + h * i); ... integ := h * ( ( f(a) + f(b) ) / 2 + S); ... Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#3
|
||||
|
||||
В исходном варианте, как я понял, возвращает результат подинтегрального выражения.
Код:
function f(x:real):real; begin f := 1+SIN(X); end; Алкоголик-аморал, явная угроза обществу Блин, я уже местный, а все равно нифига не знаю... |
#4
|
||||
|
||||
Вот не нужно заменять то, в чём не разобрался. Ты подаёшь разные значения на "вход" и получаешь разные на "выходе", а заменил одним фиксированным.
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#5
|
||||
|
||||
Да, это я уже понял. Максимально к требуемому результату подобрался путем изменения n методом перебора.
Код:
program Project2; {$APPTYPE CONSOLE} uses SysUtils; var A, B, S, h, integ:REAL; n,i:integer; function f(x:real):real; begin f := (3*ln(x+1))/(1+ln(x+1)); end; begin a:=0; b:=100; n:=3000; h := (b - a) / n; for i := 1 to n-1 do begin S := S + f(a + h * i); end; integ := h * ( ( f(a) + f(b) ) / 2 + S); writeln(integ:0:5); Readln; end. Извини за глупые вопросы, но просто физически не смогу перерыть всю мат. часть за короткий срок( Заранее спасибо. Алкоголик-аморал, явная угроза обществу Блин, я уже местный, а все равно нифига не знаю... |
#6
|
||||
|
||||
Все, разобрался, оказалось достаточно посмотреть ВУЗовские тетрадки за первый курс).
Код:
program Project2; {$APPTYPE CONSOLE} uses SysUtils; function f(x:real):real; begin f := (3*ln(x+1))/(1+ln(x+1)); end; function trap(a,b:integer):real; var S, h,k,n, integ:REAL; i:integer; begin n:= b/0.1; h := (b - a) / n; k:=0; while k < n do begin S := S + f(a + h * k); k:= k+ 1; end; result := h * ( ( f(a) + f(b) ) / 2 + S); end; var i:integer; begin i:=50; while i <= 300 do begin writeln(trap(0,i):0:5); i:= i+50; end; Readln; end. Нужно было просто просчитать кол-во шагов итераций и делов-то. Один минус - при b, равном нулю, происходит ошибка, дебаг не работает нормально, на вскидку определить не могу. Может кто сразу найдет ошибку? Заранее спасибо) Алкоголик-аморал, явная угроза обществу Блин, я уже местный, а все равно нифига не знаю... |
#7
|
||||
|
||||
Я стормозил) Жаль я не умею делить на ноль(
Конечный вариант решения задачи: Код:
program Project2; {$APPTYPE CONSOLE} uses SysUtils; function f(x:real):real; begin f := (3*ln(x+1))/(1+ln(x+1)); end; function trap(a,b:integer):real; var S, h, k, n:REAL; begin n:= b/0.1; S := 0; if n = 0 then h := 0 else h := (b - a) / n; k:=0; while k < n do begin S := S + f(a + h * k); k:= k+ 1; end; result := h * ( ( f(a) + f(b) ) / 2 + S); end; var i:integer; begin i:=0; while i <= 300 do begin writeln(trap(0,i):0:5); i:= i+50; end; Readln; end. Спасибо. Алкоголик-аморал, явная угроза обществу Блин, я уже местный, а все равно нифига не знаю... |
#8
|
|||
|
|||
Код:
const n = 8; function f(x : real) : real; begin result := -21 / sqr(6 - 7 * x); end; function integrate(a, b: real; n: integer): real; var i: integer; res, h, x: real; begin res := 0; h := (b - a) / n; for i := 1 to n - 1 do begin x := a + i * h; res := res + f(x); end; Result := h * ((f(a) + f(b)) / 2 + res); end; var c: real; begin c := integrate(-2, 0, 8); writeln('Значение: ', c); end. |