1

Тема: Метод Ейлера

Моя програма  реалізує розв’язання звичайних диференційних рівнянь (ЗДР)
методом  Ейлера за таких умов:
(Диференційне рівняння:у'cosx+ysinx=1;  Початкові умови x0=0; y0=1; b=0.5;n=10; Точний розв’язок рівняння y=sinx+cosx).
мені потрібно змінити умови на; ( Диференційне рівняння:y=у'(x+1);  Початкові умови x0=1; y0=2; b=4;n=10;
Точний розв’язок рівняння y=x+1).
Коли я це роблю похибка розв'язання стає надто великою а в частині де повинен виводитися графік вибиває помилку 201(помилка перевірки діапазона).
Допоможіть будь ласка виправити.
(програма та матеріал до неї в архіві), працюю в середовищі Turbo Pascal School Pak 1.3   або TP 7.

Post's attachments

ejler.zip 129.86 kb, 90 downloads since 2016-05-10 

Подякували: Chemist-i1

2

Re: Метод Ейлера

В кого які ідеї? Хтось може пояснити вчому проблема?

3 Востаннє редагувалося ADR (13.05.2016 01:31:31)

Re: Метод Ейлера

Як це читати?!

Прихований текст

Program EILER;
uses crt,graph;
function P(x:real;y:real):real;
begin
P:={(cos(x)*(cos(x)-sin(x))+sin(x)*(sin(x)+cos(x)));}y/x+1;
end;
function R(x1:real):real;
begin
R:={=sin(x1)+cos(x1); }  x1+1; 
end;
Var
A,x,y,hx:real;
mx,my:real;
px,py,px1,py1:word;
w,h,x0,y0,dx,dy:integer;
grD,grM:integer;
s,s1:string;
x10, y10, b,F1,h1,w1:real;
n, i, k:word;
t:text;
x1: array [0..1000] of real;
E:array  [1..3,0..1000] of real;
Label M;
Begin
clrscr;
writeln('x0,y0:');
readln(x10,y10);
writeln('b:');
readln(b);
writeln('Vvedit n');
readln(n);
h1:=(b-x10)/n;
x1[0]:=x10;
for i:= 1 to 3 do E[i,0]:=y10;
for k:=1 to n do
begin
x1[k]:=x1[k-1]+h1;
w1:=0;
for i:=1 to 3 do
begin
If  w1=0 then goto M;
A:=x1[k-1]+h1/(2*w1);
if A=1 then A:=1.1;
F1:=P(A,E[i,k-1]+h1*P(x1[k-1],E[i,k-1])/(2*w1));
    M: E[i,k]:=E[i,k-1]+h1*((1-w1)*P(x1[k-1],E[i,k-1])+w1*

    F1);
w1:=w1+0.5;
end;
end;
write('xp=');
for k:=0 to n do write(' ',x1[k]:1:3);
writeln;
writeln('Method Eilera:');write('y1=');for k:=0 to n do write(' ',E[1,k]:1:3); writeln;
writeln('Pohibka1=',100*abs(E[1,n]-R(x1[n]))/R(x1[n]):1:3,'%');
writeln('Vipravlen metod Eilera:');write('y2=');for k:=0 to n do write(' ',E[2,k]:1:3); 
writeln('Pohibka2=',100*abs(E[2,n]-R(x1[n]))/R(x1[n]):1:3,'%');
writeln('Modifikovan metod Eilera:');write('y3=');for k:=0 to n do write(' ',E[3,k]:1:3);writeln;
writeln('Pohibka3=',100*abs(E[3,n]-R(x1[n]))/R(x1[n]):1:3,'%');
assign(t,'D:/text.txt');
reset(t);
rewrite(t);
write(t,'xp=');
for k:=0 to n do write(t,' ',x1[k]:1:3);
writeln(t);
writeln(t,'Method Eilera:');write(t,'y1=');for k:=0 to n do write(t,' ',E[1,k]:1:3); writeln(t);
writeln(t,'Vipravlen metod Eilera:');write(t,'y2=');for k:=0 to n do write(t,' ',E[2,k]:1:3); writeln(t);
writeln(t,'Modifikovan metod Eilera:');write(t,'y3=');for k:=0 to n do write(t,' ',E[3,k]:1:3);writeln(t);
close(t);
readkey;

clrscr;
grD:=detect;
initgraph(grD,GrM,'');
y0:=getmaxY div 2 + 180;
w:=580;
h:=y0-20;
if x1[0]<=0 then mx:=580/(x1[n]-x1[0])
else mx:=580/x1[n];
my:=(y0-220)/1;
dx:=round(mx/2);
dy:=round(my/10);
if x1[0]>=0 then X0:=30 else x0:=30-round(x1[0]*mx);
SetBkColor(black);
setlinestyle(1,0,0);
Setcolor(blue);
for i:=1 to 20 do
begin
line(10,y0-i*dy,630,y0-i*dy);
line(10,y0+i*dy,630,y0+i*dy);
line(x0+i*dx,0,x0+i*dx,480);
line(x0-i*dx,0,x0-i*dx,480);

if i<10 then
begin
str(i,s);
outtextXY(x0-25,y0-i*dy,'0.'+s);
end
else
begin
str(i div 10,s);
str(i-10,s1);
outtextXY(x0-25,y0-i*dy,s+'.'+s1);
end;

str(i,s);
outtextXY(x0-30,y0+i*dy-10,'-0.'+s);

str(i div 2,s1);
if odd(i) then s1:=s1+'.5'
else s1:=s1+'.0';
outtextXY(x0+i*dx,y0+10,s1);

str(i div 2,s1);
if odd(i) then s1:='-'+s1+'.5'
else s1:='-'+s1+'.0';
outtextXY(x0-i*dx,y0+10,s1);
end;
outtextXY(x0+5,y0+10,'0');
outtextXY(getmaxX-10,y0-10,'X');
outtextXY(x0+10,5, 'Y');
SetColor(11);
setlinestyle(1,0,0);
line(0,y0,640,y0);
line(x0,480,x0,0);
x:=x1[0];
hx:=0.0001;
while x<=x1[n] do
begin
px:=x0+round(x*mx);
py:=y0-round(R(x)*my);
Putpixel(px,py,red);
x:=x+hx;
end;
setlinestyle(0,0,0);
for i:=0 to n do begin
px:=x0+round(x1[i]*mx);
py:=y0-round(E[1,i]*my);
Putpixel (px,py,green);
if i>0 then begin setcolor(green);line(px1,py1,px,py); end;
px1:=px;
py1:=py;
end;
for i:=0 to n do begin
px:=x0+round(x1[i]*mx);
py:=y0-round(E[2,i]*my);
Putpixel (px,py,14);
if i>0 then begin setcolor(14);line(px1,py1,px,py); end;
px1:=px;
py1:=py;
end;
for i:=0 to n do begin
px:=x0+round(x1[i]*mx);
py:=y0-round(E[3,i]*my);
Putpixel (px,py,11);
if i>0 then begin setcolor(11);line(px1,py1,px,py); end;
px1:=px;
py1:=py;
end;
setcolor(15);
BAR(450,300,595,380);
setfillstyle(0,15);
floodfill(500,350,15);
setcolor(red);
line(460,315,485,315);
outtextxy(490,312,'Rozvazok');
setcolor(green);
line(460,330,485,330);
outtextxy(490,328,'Metod Eilera');
setcolor(14);
line(460,345,485,345);
outtextxy(490,343,'Viprav Eilera');
setcolor(11);
line(460,360,485,360);
outtextxy(490,357,'Modif Eilera');
readkey;
closegraph;readkey;
end.

Почитайте за стилістику коду від Borlad

А тепер рийся в коді і шукай де той лейбл м (goto не варто використовувати)

If  w1=0 then goto M;
Подякували: koala1

4

Re: Метод Ейлера

ADR написав:

А тепер рийся в коді і шукай де той лейбл м (goto не варто використовувати)

If  w1=0 then goto M;
for i:=1 to 3 do
begin
If  w1=0 then goto M;
A:=x1[k-1]+h1/(2*w1);
if A=1 then A:=1.1;
F1:=P(A,E[i,k-1]+h1*P(x1[k-1],E[i,k-1])/(2*w1));
    M: E[i,k]:=E[i,k-1]+h1*((1-w1)*P(x1[k-1],E[i,k-1])+w1*  {ось він!}

    F1);
w1:=w1+0.5;
end;
виправлено

for i:=1 to 3 do begin
  if w1=0 then begin
    A:=x1[k-1]+h1/(2*w1);
    if A=1 then begin
      A:=1.1;
    end;
    F1:=P(A,E[i,k-1]+h1*P(x1[k-1],E[i,k-1])/(2*w1));
  end;
  E[i,k]:=E[i,k-1]+h1*((1-w1)*P(x1[k-1],E[i,k-1])+w1*F1);
  w1:=w1+0.5;
end;

мені чомусь здається, що тут не має бути так багато викликів P, але то треба розбиратися, а з цими назвами змінних дуже важко. Хоча б матриці, функції і допоміжні змінні перейменуйте.