Регистрация: 15.05.2017
Сообщений: 8
|
Интегрирование методом трапеций
Здравствуйте. Помогите пожалуйста грамотно составить метод трапеций с заданным количеством точек интегрирования для определенного интеграла. Нужно еще построить график (как понял - после подсчета). Почти все действия подписаны. В мемо должны выводиться промежуточные вычисления (походу не то выводит). Вот что у меня получилось. Интеграл считает естественно не правильно. Первая форма содержит метод и по мелочи. Вторая содержит график.
Код:
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Menus, jpeg, ExtCtrls, StdCtrls;
type
TIntFunc = function(X: Double): Double;
TForm2 = class(TForm)
MainMenu1: TMainMenu;
N1: TMenuItem;
N2: TMenuItem;
N3: TMenuItem;
N4: TMenuItem;
N5: TMenuItem;
Label1: TLabel;
Label2: TLabel;
Edit1: TEdit;
Edit2: TEdit;
Image1: TImage;
Edit3: TEdit;
Edit4: TEdit;
Edit5: TEdit;
Edit6: TEdit;
Edit7: TEdit;
Edit8: TEdit;
Edit10: TEdit;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
Label7: TLabel;
Label8: TLabel;
Label9: TLabel;
Label10: TLabel;
Label6: TLabel;
Label11: TLabel;
Label12: TLabel;
Label13: TLabel;
Label14: TLabel;
Label15: TLabel;
Label16: TLabel;
Edit9: TEdit;
Label17: TLabel;
Label18: TLabel;
Panel1: TPanel;
Edit11: TEdit;
Edit12: TEdit;
N6: TMenuItem;
SaveDialog1: TSaveDialog;
Memo1: TMemo;
Edit13: TEdit;
Label19: TLabel;
N7: TMenuItem;
OpenDialog1: TOpenDialog;
procedure N4Click(Sender: TObject);
procedure N2Click(Sender: TObject);
procedure N6Click(Sender: TObject);
procedure N7Click(Sender: TObject);
procedure N5Click(Sender: TObject);
procedure N3Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form2: TForm2;
buttonexit:integer;
i,eps,a1,a2,a3,a0,b1,b2,b3,b4,b5,b0,x,int1,int2:real;
implementation
uses Unit4;
{$R *.dfm}
function Fx(x:real):real;//функция
begin
Fx:=(a3*x*x*x*x*x+a2*x*x*x+a1*x*x+a0)/( b3*x*x*x*x*x*x*x*x+b2*x*x*x*x*x*x*x+b3*x*x*x*x*x*x+b2*x*x*x*x+b1*x+b0);
end;
procedure Metod_Trapeciy;//метод
var
x1,x2,x3:real;
c:longint;
begin
i:=0;
for c:=1 to round(abs(int2-int1)/eps) do
begin
x1:=Fx(int1+c*eps);
x2:=Fx(int1+c*eps+eps);
if x2>x1 then begin x3:=x1 end else begin x3:=x2;
i:=i+abs(x2-x1)*eps+abs(x3)*eps;
Form2.Memo1.lines.add(floattostr(i));
end;
end;
end;
procedure TForm2.N2Click(Sender: TObject); //перевод
begin
a1:=strtofloat(Edit1.Text);
a2:=strtofloat(Edit2.Text);
a3:=strtofloat(Edit3.Text);
a0:=strtofloat(Edit4.Text);
b1:=strtofloat(Edit5.Text);
b2:=strtofloat(Edit6.Text);
b3:=strtofloat(Edit7.Text);
b4:=strtofloat(Edit8.Text);
b5:=strtofloat(Edit9.Text);
b0:=strtofloat(Edit10.Text);
int1:=strtofloat(Edit11.Text);
int2:=strtofloat(Edit12.Text);
eps:=StrToFloat(Edit13.Text);
Metod_Trapeciy;
Label4.Caption:=FloatToStr(i);
end;
procedure TForm2.N3Click(Sender: TObject);
begin
Form4.Show;
end;
procedure TForm2.N4Click(Sender: TObject);//новый расчет
begin
Form2.Repaint;
//Form2.Close;
end;
procedure TForm2.N5Click(Sender: TObject);//выход
begin
buttonexit := MessageDlg('Выйти без сохранения?',MtConfirmation, mbYesNo, 0);
if buttonexit = mrYes then begin
Form2.close;
end;
end;
procedure TForm2.N6Click(Sender: TObject);//сохранение
var
f:textFile; //текстовый файл
begin
savedialog1.InitialDir:='d:\'; //начальная директория
savedialog1.Filter:='Текстовые файлы |*.txt'; //фильтр типов файлов
if savedialog1.Execute then //вызов диалога
begin
assignFile(f,savedialog1.FileName); //создание файла
rewrite(f);
//Добавление строк в файл
writeln(f,'Результаты:');
writeln(f,'');
writeln(f,'Исходные данные:');
writeln(f,'a1=',Edit1.Text);
writeln(f,'a2=',Edit2.Text);
writeln(f,'a3=',Edit3.Text);
writeln(f,'a0=',Edit4.Text);
writeln(f,'b1=',Edit5.Text);
writeln(f,'b2=',Edit6.Text);
writeln(f,'b3=',Edit7.Text);
writeln(f,'b4=',Edit8.Text);
writeln(f,'b5=',Edit9.Text);
writeln(f,'b0=',Edit10.Text);
writeln(f,'Нижний предел интегрирования:',Edit2.Text);
writeln(f,'Верхний предел интегрирования:',Edit1.Text);
writeln(f,'eps=',Edit13.Text);
writeln(f,'');
writeln(f,'РЕЗУЛЬТАТ:');
writeln(f,'Интеграл равен ',Label4.Caption);
closeFile(f); //закрытие файла
memo1.Lines.add('');
memo1.Lines.add('Данные вычислений записаны в файл '+savedialog1.FileName);
end;
end;
procedure TForm2.N7Click(Sender: TObject);//загрузка
var
f:File;
s:string;
SaveList:TStrings;
cl:integer;
function LoadMemo(Inp: TMemo; _c: integer): integer;
var
i, LinesCount: integer;
begin
inp.Clear;
LinesCount := strtoint(SaveList[_c]) - 1;
for i := _c to _c + LinesCount do
Inp.Lines.Add(SaveList[i + 1]);
result:=Inp.Lines.Count+1;
end;
begin
if OpenDialog1.Execute then begin
s:=OpenDialog1.FileName;
Assignfile(f,s);
Reset(f,1);
SaveList := TStringList.Create;
SaveList.LoadFromFile('FileName');
cl:=LoadMemo(memo1, 0);
LoadMemo(memo1, cl);
SaveList.Free;
CloseFile(f);
Label4.Caption:='Результат';
end;
end;
end.
График
Код:
unit Unit4;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls;
type
TForm4 = class(TForm)
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form4: TForm4;
implementation
{$R *.dfm}
procedure TForm4.Button1Click(Sender: TObject);//график
begin
Form4.Canvas.pen.style:=pssolid;;
Form4.Canvas.font.color:=clblack;
Form4.Canvas.pen.color:=clblack;
Form4.Canvas.brush.color:=clblack;
Form4.Canvas.moveto(240,176);
Form4.Canvas.lineto(0,176);
Form4.Canvas.moveto(240,176);
Form4.Canvas.lineto(472,176);
Form4.Canvas.moveto(240,176);
Form4.Canvas.lineto(240,0);
Form4.Canvas.moveto(240,176);
Form4.Canvas.lineto(240,344);
end;
procedure TForm4.Button2Click(Sender: TObject);//закрытие формы
begin
Form4.Close;
end;
end.
Нашёл в интернете такой способ реализации. Выглядит куда лучше. Может лучше с ним попробовать?
Код:
{Вычисление определенного интеграла по формуле трапеций}
Function Integral (a,b:real; {Пределы интегрирования}
n : integer; {Число шагов}
f : mpd_func): real; {Имя функции, вычисляющей
подынтегральное выражение}
var
x, h, sum : real; i : integer;
begin
h := (b-a)/n;
sum := 0.0;
for i := 1 to n-1 do begin
x := a+i*h;
sum := sum + f(x);
end;
integral := h*((f(a)+f(b))/2+sum);
end {Integral};
|