Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 30.11.2011, 22:27
Аватар для Лунтик-Некрофил
Лунтик-Некрофил Лунтик-Некрофил вне форума
Начинающий
 
Регистрация: 28.09.2009
Сообщения: 165
Репутация: 12
По умолчанию Интегрирование методом трапеций

Добрый вечер, господа!=)
Очень давно не писал на паскале/дельфине, а тут попросили знакомые помочь с интегрированием. Сам никогда мат. частью задач не занимался, а тут такой нежданчик=(
Сам алгоритм нашел, но работает он на мой взгляд не очень верно.
Код:
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  
Старый 30.11.2011, 22:36
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

И что возвращает функция 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  
Старый 30.11.2011, 22:43
Аватар для Лунтик-Некрофил
Лунтик-Некрофил Лунтик-Некрофил вне форума
Начинающий
 
Регистрация: 28.09.2009
Сообщения: 165
Репутация: 12
По умолчанию

В исходном варианте, как я понял, возвращает результат подинтегрального выражения.
Код:
function f(x:real):real;
begin
f := 1+SIN(X);
end;
Я заменял уже просчитанным значением, как я думал. Если честно, немного запутался.
__________________
Алкоголик-аморал, явная угроза обществу
Блин, я уже местный, а все равно нифига не знаю...
Ответить с цитированием
  #4  
Старый 30.11.2011, 23:04
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Вот не нужно заменять то, в чём не разобрался. Ты подаёшь разные значения на "вход" и получаешь разные на "выходе", а заменил одним фиксированным.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #5  
Старый 01.12.2011, 09:31
Аватар для Лунтик-Некрофил
Лунтик-Некрофил Лунтик-Некрофил вне форума
Начинающий
 
Регистрация: 28.09.2009
Сообщения: 165
Репутация: 12
По умолчанию

Да, это я уже понял. Максимально к требуемому результату подобрался путем изменения 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.
Как вообще должна происходить работа с шагом интегрирования? по заданию оно 0.1, здесь мне для результата 3000 мало)
Извини за глупые вопросы, но просто физически не смогу перерыть всю мат. часть за короткий срок(
Заранее спасибо.
__________________
Алкоголик-аморал, явная угроза обществу
Блин, я уже местный, а все равно нифига не знаю...
Ответить с цитированием
  #6  
Старый 01.12.2011, 12:16
Аватар для Лунтик-Некрофил
Лунтик-Некрофил Лунтик-Некрофил вне форума
Начинающий
 
Регистрация: 28.09.2009
Сообщения: 165
Репутация: 12
По умолчанию

Все, разобрался, оказалось достаточно посмотреть ВУЗовские тетрадки за первый курс).
Код:
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  
Старый 01.12.2011, 12:38
Аватар для Лунтик-Некрофил
Лунтик-Некрофил Лунтик-Некрофил вне форума
Начинающий
 
Регистрация: 28.09.2009
Сообщения: 165
Репутация: 12
По умолчанию

Я стормозил) Жаль я не умею делить на ноль(
Конечный вариант решения задачи:
Код:
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  
Старый 01.12.2011, 14:48
ART ART вне форума
Продвинутый
 
Регистрация: 13.02.2006
Адрес: Магнитогорск
Сообщения: 669
Репутация: 14745
По умолчанию

Код:
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.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 09:38.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter