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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 22.05.2012, 10:08
defend defend вне форума
Прохожий
 
Регистрация: 15.12.2011
Сообщения: 10
Репутация: 10
По умолчанию Проблема с интегрированием!

Добрый день, у меня такая проблема при вводе границ интеграла от -2.5 до 4,5 всё зависает и не работает, мной было посчитан интеграл и ответ получился отрицательным, -1,288. при положительных границах всё считает! Где ошибка?

Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, jpeg, TeEngine, Series, TeeProcs, Chart;

type
  TForm1 = class(TForm)
    edt1: TEdit;
    lbl1: TLabel;
    edt2: TEdit;
    lbl2: TLabel;
    lbl4: TLabel;
    lbl5: TLabel;
    Button1: TButton;
    edt4: TEdit;
    edt5: TEdit;
    lbl6: TLabel;
    lbl7: TLabel;
    lbl8: TLabel;
    edt6: TEdit;
    edt7: TEdit;
    edt8: TEdit;
    img1: TImage;
    Chart1: TChart;
    Grafiks: TButton;
    Series1: TFastLineSeries;
    procedure Button1Click(Sender: TObject);
    procedure GrafiksClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;


var
  Form1: TForm1;
  a,b:Real;

implementation

{$R *.dfm}

function f(x:real):real;
begin
 f:=(3*x+4)/((x+1)*sqr(x-2));
end;

function Trapeces(a,b:real;n:integer):real;
var
  i:integer;
  x1,x2,p,S:real;
begin
    p:=abs((b-a))/n;
    S:=0;
    for i:=0 to n-1 do
      begin
        x1:=a+i*p;
        x2:=a+(i+1)*p;
        S:=S+((f(x1)+f(x2))/2)*p;
      end;
    Trapeces:=S;
end;

function Simpson(a,b:real;n:integer):real;
var
  i:integer;
  x1,x2,p,S:real;
begin
  p:=(abs(b-a))/n;
  S:=0;
  for i:=0 to n-1 do
    begin
      x1:=a+i*p;
      x2:=a+(i+1)*p;
      S:=S+((x2-x1)/6)*(f(x1)+4*f((x1+x2)/2)+f(x2));
    end;
  Simpson:=S;
end;

function LabaisTaisnstruri(a,b:real;n:integer):real;
var
  i:integer;
  x,p,S:real;
begin
  p:=(abs(b-a))/n;
  S:=0;
  for i:=1 to n do
    begin
      x:=a+i*p;
      S:=S+p*f(x);
    end;
  LabaisTaisnstruri:=S;
end;

function KreisaisTaisnstruri(a,b:real;n:integer):real;
var
  i:integer;
  x,p,S:real;
begin
  p:=(abs(b-a))/n;
  S:=0;
  for i:=0 to n-1 do
    begin
      x:=a+(i+1)*p;
      S:=S+p*f(x);
    end;
  KreisaisTaisnstruri:=S;
end;

function VidejaisTaisnstruri(a,b:real;n:integer):real;
var
  i:integer;
  x,p,S:real;
begin
  p:=(abs(b-a))/n;
  S:=0;
  for i:=0 to n-1 do
    begin
      x:=a+i*p+p/2;
      S:=S+p*f(x);
    end;
  VidejaisTaisnstruri:=S;
end;

function int1(a,b,e:real):real;
var
  n:integer;
  I1,I2:real;
begin
  n:=1;
  repeat
    I1:=Trapeces(a,b,n);
    I2:=Trapeces(a,b,2*n);
    n:=2*n;
  until (abs(I2-I1)<=0.002);
  int1:=I2;
end;

function int2(a,b,e:real):real;
var
  n:integer;
  I1,I2:real;
begin
  n:=1;
  repeat
    I1:=Simpson(a,b,n);
    I2:=Simpson(a,b,2*n);
    n:=2*n;
  until (abs(I2-I1)<=0.002);
  int2:=I2;
end;

function int3(a,b,e:real):real;
var
  n:integer;
  I1,I2:real;
begin
  n:=1;
  repeat
    I1:=LabaisTaisnstruri(a,b,n);
    I2:=LabaisTaisnstruri(a,b,2*n);
    n:=2*n;
  until (abs(I2-I1)<=0.002);
  int3:=I2;
end;

function int4(a,b,e:real):real;
var
  n:integer;
  I1,I2:real;
begin
  n:=1;
  repeat
    I1:=KreisaisTaisnstruri(a,b,n);
    I2:=KreisaisTaisnstruri(a,b,2*n);
    n:=2*n;
  until (abs(I2-I1)<=0.002);
  int4:=I2;
end;

function int5(a,b,e:real):real;
var
  n:integer;
  I1,I2:real;
begin
  n:=1;
  repeat
    I1:=VidejaisTaisnstruri(a,b,n);
    I2:=VidejaisTaisnstruri(a,b,2*n);
    n:=2*n;
  until (abs(I2-I1)<=0.002);
  int5:=I2;
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
      a:=StrToFloat(edt1.Text);
    b:=StrToFloat(edt2.Text);
  edt4.Text:=FloatToStr(int1(a,b,0.002));
  edt5.Text:=FloatToStr(int2(a,b,0.002));
  edt6.Text:=FloatToStr(int3(a,b,0.002));
  edt7.Text:=FloatToStr(int4(a,b,0.002));
  edt8.Text:=FloatToStr(int5(a,b,0.002));


end;



procedure TForm1.GrafiksClick(Sender: TObject);
var
  i:integer;
  x,y:real;
begin
 Series1.Clear;
  for i:=0 to 2500 do
    begin
      x:=a+i*0.001;
      y:=f(x);
      Series1.AddXY(x,y);
    end;
end;



end.
Ответить с цитированием
  #2  
Старый 23.05.2012, 06:04
Аватар для Kailon
Kailon Kailon вне форума
Активный
 
Регистрация: 06.06.2010
Сообщения: 340
Версия Delphi: 11.3
Репутация: 429
Сообщение

Трассировка программы говорит о чем-то? Смотри как выполняются все функции и что возвращают. А зависание скорее всего из-за зацикливания в каком-либо цикле (скорее всего там где используется repeat...until).
__________________
Всегда пишите код так, будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете.
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter