11. laborgyakorlat

Numerikus számítások fizikusoknak

Contents

clear all, close all

Numerikus integrálás

quad parancs

f=@(x)exp(-x.^2);
quad(f,0,2)
%vagy
quad('exp(-x.^2)',0,2)
%vagy az abszolút hiba megadásával
quad('exp(-x.^2)',0,2,10^-10)
ans =
   0.882081194911110
ans =
   0.882081194911110
ans =
   0.882081390750500

Trapézformula

f=@(x)exp(-x.^2);
n=111;
x=linspace(0,2,n);
y=f(x);

sum((diff(y)/2+y(1:n-1)).*diff(x))

% Egyforma osztásköz esetén
h=2/(n-1);
(y(1)/2+y(end)/2+sum(y(2:end-1)))*h
ans =
   0.882079372621402
ans =
   0.882079372621401

Simpson-formula

f=@(x)exp(-x.^2);
n=20;
x=linspace(0,2,2*n-1);
y=f(x);

% Egyforma osztásköz esetén
h=2/(n-1);
(y(1)+y(end)+4*sum(y(2:2:end-1))+2*sum(y(3:2:end-2)))*h/6
ans =
   0.882081359526869

Differenciálegyenletek megoldása

Kezdetiérték-feladatok

Euler-módszer

Runge-Kutta 4

Euler-módszer

f=@(t,y)y;
t0=0;
y0=1;
tmax=1;
kmax=35;
h=(tmax-t0)/kmax;
t=t0;
yy(1)=y0;
for k=1:kmax
   yy(k+1)=yy(k)+h*f(t,yy(k));
   t=t+h;
end;
xxx=0:0.01:1;
yyy=exp(xxx);
tt=[t0:h:tmax];
plot(tt,yy,'o-',xxx,yyy,'r-')

Negyedrendű Runge-Kutta-módszer

f=@(t,y)y;
t0=0;
y0=1;
tmax=1;
kmax=35;
h=(tmax-t0)/kmax;
t=t0;
yy(1)=y0;
for k=1:kmax
   k1=f(t,yy(k));
   k2=f(t+h/2,yy(k)+h*k1/2);
   k3=f(t+h/2,yy(k)+h*k2/2);
   k4=f(t+h,yy(k)+h*k3);
   yy(k+1)=yy(k)+h/6*(k1+2*k2+2*k3+k4);
   t=t+h;
end;
xxx=0:0.01:1;
yyy=exp(xxx);
tt=[t0:h:tmax];
plot(tt,yy,'o-',xxx,yyy,'r-')

Megoldás a matlab beépített programjaival

%(ode45, ode23, ode113, ode15s, ode23s, ode23t, ode23tb)
% Pl. ode45, [x,y]=ode45(f,tintervallum,y0), ha nem kérünk kimenő változót,
% akkor grafikont kapunk a megoldásról.

f=@(t,y)t+y; % f megadható Matlab függvényként is
ode45(f,[0,2],2)
[t,y]=ode45(f,[0,2],2)
t =
                   0
   0.050000000000000
   0.100000000000000
   0.150000000000000
   0.200000000000000
   0.250000000000000
   0.300000000000000
   0.350000000000000
   0.400000000000000
   0.450000000000000
   0.500000000000000
   0.550000000000000
   0.600000000000000
   0.650000000000000
   0.700000000000000
   0.750000000000000
   0.800000000000000
   0.850000000000000
   0.900000000000000
   0.950000000000000
   1.000000000000000
   1.050000000000000
   1.100000000000000
   1.150000000000000
   1.200000000000000
   1.250000000000000
   1.300000000000000
   1.350000000000000
   1.400000000000000
   1.450000000000000
   1.500000000000000
   1.550000000000000
   1.600000000000000
   1.650000000000000
   1.700000000000000
   1.750000000000000
   1.800000000000000
   1.850000000000000
   1.900000000000000
   1.950000000000000
   2.000000000000000
y =
   2.000000000000000
   2.103813590125000
   2.215513162000000
   2.335502904125000
   2.464208320000000
   2.602076665555032
   2.749576971089970
   2.907202913559662
   3.075474204119074
   3.254937122401535
   3.446164543316089
   3.649759445264519
   3.866356604892830
   4.096623249660188
   4.341259090569270
   4.601000607112278
   4.876623117245087
   5.168941574436766
   5.478810607646518
   5.807129754968619
   6.154845991904594
   6.522954704881698
   6.912499740080876
   7.324579795825191
   7.760351510618490
   8.221030652203556
   8.707892177200728
   9.222278038788858
   9.765600958444280
  10.339345878259765
  10.945070033787276
  11.584412490361139
  12.259098749910502
  12.970942524825713
  13.721845826928668
  14.513810615164397
  15.348944422374553
  16.229462521902729
  17.157688036263107
  18.136066163663244
  19.167171050560814

Differenciálegyenlet-rendszer

Példa

f=@(t,y)[y(1)*(2-y(2));y(2)*(y(1)-1)];
figure(1)
ode45(f,[0,20],[1,3])
[t,y]=ode45(f,[0,20],[1,3])
pause
figure(2)
plot(y(:,1),y(:,2))
t =
                   0
   0.050237728630192
   0.100475457260383
   0.150713185890575
   0.200950914520766
   0.354105716308268
   0.507260518095770
   0.660415319883272
   0.813570121670774
   0.985228093793834
   1.156886065916894
   1.328544038039954
   1.500202010163014
   1.686511985064330
   1.872821959965646
   2.059131934866962
   2.245441909768278
   2.480277584811522
   2.715113259854766
   2.949948934898011
   3.184784609941255
   3.342845191428611
   3.500905772915967
   3.658966354403324
   3.817026935890680
   3.975087517378036
   4.133148098865393
   4.291208680352749
   4.449269261840105
   4.607486189790270
   4.765703117740435
   4.923920045690600
   5.082136973640765
   5.212906079671490
   5.343675185702216
   5.474444291732941
   5.605213397763666
   5.798492547809351
   5.991771697855037
   6.185050847900723
   6.378329997946407
   6.585206261175618
   6.792082524404828
   6.998958787634038
   7.205835050863248
   7.425551521204222
   7.645267991545194
   7.864984461886166
   8.084700932227140
   8.219222464808299
   8.353743997389458
   8.488265529970617
   8.622787062551776
   8.757308595132935
   8.891830127714094
   9.026351660295253
   9.160873192876412
   9.302095723414293
   9.443318253952176
   9.584540784490059
   9.725763315027940
   9.866985845565822
  10.008208376103704
  10.149430906641587
  10.290653437179468
  10.476955347847667
  10.663257258515866
  10.849559169184063
  11.035861079852262
  11.257153174806737
  11.478445269761210
  11.699737364715684
...

Példa

f=@(t,y)[y(2);min(10*t,20)/2.5-75/2.5*y(1)];
[t,y]=ode45(f,[0,20],[0,0]);
plot(t,y(:,2))