![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | 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); ... |
|
#3
|
||||
|
||||
|
В исходном варианте, как я понял, возвращает результат подинтегрального выражения.
Код:
function f(x:real):real; begin f := 1+SIN(X); end; |
|
#4
|
||||
|
||||
|
Вот не нужно заменять то, в чём не разобрался. Ты подаёшь разные значения на "вход" и получаешь разные на "выходе", а заменил одним фиксированным.
|
|
#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.
|