IPB
ЛогинПароль:

> ВНИМАНИЕ!

Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

 
 Ответить  Открыть новую тему 
> Проблема с арктангенсом, Нужно посчитать определёный интеграл от аркангенса.
сообщение
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 20
Пол: Мужской

Репутация: -  0  +


Доброго времени суток. Вот такая задача...посчитать тремя методами(Симсона,трапеций и прямоугольников) определёный интеграл от arctg(x)/x .Никогда не сталкивался с арктангенсом...никак не пойму что у меня не так...вот текст програмы:

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;

type
TForm1 = class(TForm)
Label1: TLabel;
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
RadioGroup1: TRadioGroup;
Button1: TButton;
Label5: TLabel;
Edit4: TEdit;
function fnk(x:real):real;
function Metod1(a,b,e:real):real;
function Metod2(a,b,e:real):real;
function Metod3(a,b,e:real):real;
procedure Button1Click(Sender: TObject);
function ArcTan(x:real):real;
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
a,b,e,x:real;
implementation

{$R *.dfm}

function Tform1.fnk(x:real):real;
begin
fnk:=(ArcTan(x))/x;
end;

function TForm1.Metod1(a,b,e:real):real;
var i,n:integer;
h,Spred,Stek,Cht,Ncht:real;
begin
n:=16;
h:=(b-a)/n;
Result:=fnk(a)+fnk(b);
Spred:=0;
Repeat
x:=a;
h:=(b-a)/n;
Stek:=0;
Cht:=0;
Ncht:=0;
For i:=1 to n do
begin
if (i mod 2)=0 then
Cht:=Cht+fnk(x)
Else
Ncht:=Ncht+fnk(x);
x:=x+h;
end;
Stek:=h/3*(Result+2*Cht+4*Ncht);
if (abs(Spred-Stek)>e) then
begin
n:=n*2;
Spred:=Stek;
end;
Until (abs(Spred-Stek)<=e);
Metod1:=Stek;
end;


function Tform1.Metod2(a,b,e:real):real;
var n:integer;
Spred,h:real;
begin
n:=2;
h:=b-a;
Result:=fnk(a)*h;
repeat
Spred:=Result;
h:=(b-a)/n;
x:=a;
result:=0;
n:=2*n;
while x<b do
begin
Result:=Result+fnk(x)*h;
x:=x+h;
end;
until abs(Spred-Result)<=e;
Metod2:=Result;
end;

function TForm1.Metod3(a,b,e:real):real;
var Spred,h:real;
i,n:Integer;
begin
h:=b-a;
Result:=(fnk(a)+fnk(b))/2*h;
n:=1;
repeat
Spred:=Result;
h:=h/2;
n:=n*2;
Result:=Result/2;
for i := 1 to n div 2 do
begin
x:=a+h*(i*2-1);
Result:=Result+fnk(x)*h;
end;
until abs(Spred-Result)<=e;
Metod3:=Result;
end;

procedure TForm1.Button1Click(Sender: TObject);
var m:real;
begin
a:=StrToFloat(Edit1.Text);
b:=StrToFloat(Edit2.Text);
e:=StrToFloat(Edit3.Text);
Case RadioGroup1.ItemIndex of
0: m:=Metod1(a,b,e);
1: m:=Metod2(a,b,e);
2: m:=Metod3(a,b,e);
end;
Edit4.Text:=FloatToStr(m);
end;

end.
Заранее спасибо)

Добавлено через 3 мин.
Про компиляции пишет такие ошибки:

[Error] Unit1.pas(27): Unsatisfied forward or external declaration: 'TForm1.ArcTan'
[Fatal Error] Project1.dpr(5): Could not compile used unit '..\progra\Unit1.pas'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






type
TForm1 = class(TForm)
Label1: TLabel;
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
RadioGroup1: TRadioGroup;
Button1: TButton;
Label5: TLabel;
Edit4: TEdit;
function fnk(x:real):real;
function Metod1(a,b,e:real):real;
function Metod2(a,b,e:real):real;
function Metod3(a,b,e:real):real;
procedure Button1Click(Sender: TObject);
// function ArcTan(x:real):real; { Закомментируй это }
private
{ Private declarations }
public
{ Public declarations }
end;

, потому что ArcTan - библиотечная функция, не надо ее включать в класс формы... А если уж включаешь описание, то надо и реализацию делать, а у тебя этого нет (о чем компилятор и говорит)...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Новичок
*

Группа: Пользователи
Сообщений: 20
Пол: Мужской

Репутация: -  0  +


Пасибо ))) закомментировал и написал вот так...
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;

type
TForm1 = class(TForm)
Label1: TLabel;
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
RadioGroup1: TRadioGroup;
Button1: TButton;
Label5: TLabel;
Edit4: TEdit;
function fnk(x:real):real;
function Metod1(a,b,e:real):real;
function Metod2(a,b,e:real):real;
function Metod3(a,b,e:real):real;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
a,b,e,x:real;
implementation

{$R *.dfm}

function Tform1.fnk(x:real):real;
begin
fnk:=arctan(x)/x;
end;

function TForm1.Metod1(a,b,e:real):real;
var i,n:integer;
h,Spred,Stek,Cht,Ncht:real;
begin
n:=16;
h:=(b-a)/n;
Result:=fnk(a)+fnk(b);
Spred:=0;
Repeat
x:=a;
h:=(b-a)/n;
Stek:=0;
Cht:=0;
Ncht:=0;
For i:=1 to n do
begin
if (i mod 2)=0 then
Cht:=Cht+fnk(x)
Else
Ncht:=Ncht+fnk(x);
x:=x+h;
end;
Stek:=h/3*(Result+2*Cht+4*Ncht);
if (abs(Spred-Stek)>e) then
begin
n:=n*2;
Spred:=Stek;
end;
Until (abs(Spred-Stek)<=e);
Metod1:=Stek;
end;


function Tform1.Metod2(a,b,e:real):real;
var n:integer;
Spred,h:real;
begin
n:=2;
h:=b-a;
Result:=fnk(a)*h;
repeat
Spred:=Result;
h:=(b-a)/n;
x:=a;
result:=0;
n:=2*n;
while x<b do
begin
Result:=Result+fnk(x)*h;
x:=x+h;
end;
until abs(Spred-Result)<=e;
Metod2:=Result;
end;

function TForm1.Metod3(a,b,e:real):real;
var Spred,h:real;
i,n:Integer;
begin
h:=b-a;
Result:=(fnk(a)+fnk(b))/2*h;
n:=1;
repeat
Spred:=Result;
h:=h/2;
n:=n*2;
Result:=Result/2;
for i := 1 to n div 2 do
begin
x:=a+h*(i*2-1);
Result:=Result+fnk(x)*h;
end;
until abs(Spred-Result)<=e;
Metod3:=Result;
end;

procedure TForm1.Button1Click(Sender: TObject);
var m:real;
begin
a:=StrToFloat(Edit1.Text);
b:=StrToFloat(Edit2.Text);
e:=StrToFloat(Edit3.Text);
Case RadioGroup1.ItemIndex of
0: m:=Metod1(a,b,e);
1: m:=Metod2(a,b,e);
2: m:=Metod3(a,b,e);
end;
Edit4.Text:=FloatToStr(m);
end;

end.
Теперь при запуске программы, она компилируется и вылетает, т.е пишет Project Project1.exe raised exception class EInavlidO with message 'Inavlid floating point operation" Process stop.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гость






Цитата
Теперь при запуске программы, она компилируется и вылетает
А это уже зависит от входных данных, скажем, при попытке деления на 0 программа будет вылетать.
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 29.03.2024 4:11
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name