Pascal の微分方程式にオイラー法を適用する手順を書かなければなりません。私はこれを持っています:
program Euler_proc;
{$mode objfpc}{$H+}
uses
{$IFDEF UNIX}{$IFDEF UseCThreads}
cthreads,
{$ENDIF}{$ENDIF}
Classes
{ you can add units after this };
{$IFDEF WINDOWS}{$R project1.rc}{$ENDIF}
{THIS PART I JUST COPIED FROM BOOK: }
type fxy = function (x,y : Extended) : Extended;
function f(x,y:Extended): Extended; far;
begin
f:= x+x*y+y+1;
end;
procedure Euler (var x0 : Extended;
x1 : Extended;
var y : Extended;
f : fxy;
mh,eps : Extended;
var h : Extended;
var fl : Boolean;
var st : Integer);
const c=3.333333333333333333e-1;
var h1,h2,g,g1,x,xh,y1,y2,yh : Extended;
hend,tend : Boolean;
begin
st:=0;
if fl
then begin
h:=x1-x0;
fl:=false
end;
if h<=0
then st:=1
else begin
tend:=true;
hend:=true;
x:=x0;
repeat
g:=h/2;
g1:=g/2;
yh:=y+g*f(x,y);
xh:=x+g;
y1:=y+h*f(xh,yh);
yh:=y+g1*f(x,y);
xh:=x+g1;
y2:=y+g*f(xh,yh);
xh:=x+g;
yh:=y2+g1*f(xh,y2);
y2:=y2+g*f(xh,yh);
xh:=ln((1+c)*abs(y1-y2)/eps);
h1:=h/exp(c*xh);
if h1<=c*h
then if 2*h1<mh
then begin
st:=2;
hend:=false;
y:=y2;
x:=x+h;
h2:=h
end
else h:=2*h1
else if h1>=h
then if x+2*h<=x1
then h:=2*h
else begin
h2:=h;
h:=x1-x;
x:=x+h;
tend:=false
end
else begin
y:=y2;
x:=x+h;
if x+2*h1<x1
then h:=2*h1
else begin
h:=x1-x;
x:=x+h;
h2:=2*h1;
if h2>x1-x0
then h2:=x1-x0;
tend:=false
end
end
until not tend or not hend;
if hend
then begin
g:=h/2;
xh:=x+g;
yh:=y+g*f(x,y);
y:=y+h*f(xh,yh)
end;
x0:=x;
h:=h2
end
end;
{THIS IS MY CODE:}
var n_st:Integer;
n_h :Extended;
n_f :fxy;
n_y :Extended;
n_x0:Extended;
n_fl:Boolean;
n_x1:Extended;
n_mh:Extended;
n_esp:Extended;
BEGIN
//Euler(x0,x1,y,f,mh,esp,h,fl,st);
n_x0:=-1;
n_y:=1;
n_fl:=True;
n_x1:=1;
n_mh:=1e-4;
n_esp:=1e-8;
Euler(n_x0,n_x1,n_y,n_f,n_mh,n_esp,n_h,n_fl,n_st);
writeln(n_x0);
writeln(n_y);
writeln(n_h);
writeln(n_fl);
readln();
readln();
END.
プロシージャ Euler() のコードは問題ありません。本からコピーしました。Lazarus でコンパイルすると、次のエラーが発生しました。
プロジェクト project1.exe で例外クラス 'External: SIGSEGV' が発生しました
だから私は、Windowsコンソールを介してフォルダーから直接アプリを実行しようとしました-そして、私は得ました:
$00000000 で未処理の例外が発生しました: EAccessViolation: アクセス違反 $00000000 $00401A78 メイン、project1.lpr の 123 行目
別のコンパイラ (Dev-Pascal) でコンパイルしようとしています - 動作していますが、何も表示されません。何が起こるかわかりません。何が悪いのか誰にも分かりますか?