常微分方程數值解實驗報告

2021-03-04 00:17:20 字數 4210 閱讀 3269

學院:數學與資訊科學

專業:資訊與計算科學

姓名:鄭思義

學號:201216524

課程:常微分方程數值解

實驗一:常微分方程的數值解法

1、分別用euler法、改進的euler法(預報校正格式)和s—k法求解初值問題。(h=0.1)並與真解作比較。

1.1實驗**:

%尤拉法

function [x,y]=naeuler(dyfun,xspan,y0,h)

%dyfun是常微分方程,xspan是x的取值範圍,y0是初值,h是步長

x=xspan(1):h:xspan(2);

y(1)=y0;

for n=1:length(x)-1

y(n+1)=y(n)+h*feval(dyfun,x(n),y(n));

end%改進的尤拉法

function [x,m,y]=naeuler2(dyfun,xspan,y0,h)

%dyfun是常微分方程,xspan是x的取值範圍,y0是初值,h是步長。

%返回值x為x取值,m為預報解,y為校正解

x=xspan(1):h:xspan(2);

y(1)=y0;

m=zeros(length(x)-1,1);

for n=1:length(x)-1

k1=feval(dyfun,x(n),y(n));

y(n+1)=y(n)+h*k1;

m(n)=y(n+1);

k2=feval(dyfun,x(n+1),y(n+1));

y(n+1)=y(n)+h*(k1+k2)/2;

end%四階s—k法

function [x,y]=rk(dyfun,xspan,y0,h)

%dyfun是常微分方程,xspan是x的取值範圍,y0是初值,h是步長。

x=xspan(1):h:xspan(2);

y(1)=y0;

for n=1:length(x)-1

k1=feval(dyfun,x(n),y(n));

k2=feval(dyfun,x(n)+h/2,y(n)+(h*k1)/2);

k3=feval(dyfun,x(n)+h/2,y(n)+(h*k2)/2);

k4=feval(dyfun,x(n)+h,y(n)+h*k3);

y(n+1)=y(n)+(h/6)*(k1+2*k2+2*k3+k4

end%主程式

x=[0:0.1:1];y=exp(-x)+x;

dyfun=inline('-y+x+1');

[x1,y1]=naeuler(dyfun,[0,1],1,0.1);

[x2,m,y2]=naeuler2(dyfun,[0,1],1,0.1);

[x3,y3]=rk(dyfun,[0,1],1,0.1);

plot(x,y,'r',x1,y1,'+',x2,y2,'*',x3,y3,'o');

xlabel('x');ylabel('y');

legend('y為真解','y1為尤拉解','y2為改進尤拉解','y3為s—k解','location','northwest');

1.2實驗結果:

2、選取一種理論上收斂但是不穩定的演算法對問題1進行計算,並與真解作比較。(選改進的尤拉法)

2.1實驗思路:演算法的穩定性是與步長h密切相關的。

而對於問題一而言,取定步長h=0.1不論是單步法或低階多步法都是穩定的演算法。所以考慮改變h取值範圍,藉此分析不同步長會對結果造成什麼影響。

故依次採用h=2.0、2.2、2.

4、2.6的改進尤拉法。

2.2實驗**:

%%主程式

x=[0:3:30];y=exp(-x)+x;

dyfun=inline('-y+x+1');

[x1,m1,y1]=naeuler2(dyfun,[0,20],1,2);

[x2,m2,y2]=naeuler2(dyfun,[0,22],1,2.2);

[x3,m3,y3]=naeuler2(dyfun,[0,24],1,2.4);

[x4,m4,y4]=naeuler2(dyfun,[0,26],1,2.6);

subplot(2,2,1)

plot(x,y,'r',x1,y1,'+');xlabel('h=2.0');

subplot(2,2,2)

plot(x,y,'r',x2,y2,'+');xlabel('h=2.2');

subplot(2,2,3)

plot(x,y,'r',x3,y3,'+');xlabel('h=2.4');

subplot(2,2,4)

plot(x,y,'r',x4,y4,'+');xlabel('h=2.6');

2.3實驗結果:

實驗結果分析:

從實驗1結果可以看出,在演算法滿足收斂性和穩定性的前提下,eluer法雖然計算並不複雜,凡是精度不足,反觀改進的eluer法和s—k法雖然計算略微複雜但是結果很精確。

實驗2改變了步長,導致演算法理論上收斂但是不滿足穩定性。結果表示步長h越大,結果越失真。對於同乙個問題,步長h的選取變得尤為重要,這三種單步法的絕對穩定區間並不一樣,所以並沒有一種方法是萬能的,我們應該根據不同的步長來選取合適的方法。

實驗二:ritz-galerkin方法與有限差分法

1、用中心差分格式求解邊值問題

取步長h=0.1,並與真解作比較。

1.1實驗**:

%中心差分法

function u=fdm(xspan,y0,y1,h)

%xspan為x取值範圍,y0,y1為邊界條件,h為步長

n=1/h;

d=zeros(1,n-1);

for i=1:n

x(i)=xspan(1)+i*h;

q(i)=1;

f(i)=x(i);

endfor i=1:n-1

d(i)=q(i)*h*h+2;

end a=diag(d);

b=zeros(n-1);

c=zeros(n-1);

for i=1:n-2

b(i+1,i)=-1;

endfor i=1:n-2

c(i,i+1)=-1;

enda=a+b+c;

for i=2:n-2

b(i,1)=f(i)*h*h;

endb(1,1)=f(1)*h*h+y0;

b(n-1,1)=f(n-1)*h*h+y1;

u= inv(a)*b;

%主程式

x=0:0.1:1;

y=x+(exp(1)*exp(-x))/(exp(2)-1)-(exp(1)*exp(x))/(exp(2)-1);

y1=fdm([0,1],0,0,0.1);

y1=[0,y1',0];

plot(x,y,'r',x,y1,'+')

xlabel('x');ylabel('y');

legend('y真解','y1中心差分法','location','northwest');

1.2實驗結果:

2、用ritz-galerkin方法求解上述問題,並與真值作比較,列表畫圖。

2.1實驗**:

%ritz_galerkin法

function vu=ritz_galerkin(x0,y0,x1,y1,h)

%x0,x1為x取值範圍,y0,y1為邊界條件,h為步長

n=1/h;

syms x;

for i=1:n

fai(i)=x*(1-x)*(x^(i-1));

dfai(i)=diff(x*(1-x)*(x^(i-1)));

endfor i=1:n

for j=1:n

fun=dfai(i)*dfai(j)+fai(i)*fai(j);

a(i,j)=int(fun,x,0,1);

endfun=x*fai(i)+dfai(i);

f(i)=int(fun,x,0,1);

endc=inv(a)*f';

product=c.*fai';

sum=0;

for i=1:n

sum=sum+product(i);

endvu=;

for y=0:h:1

v=subs(sum,x,y);

vu=[vu,v];

endy=0:h:1;

yy=0:0.1:1;

u=sin(yy)/sin(1)-yy;

常微分方程數值解實驗報告

2012年10月17日 實驗目的 1 通過用matlab程式設計運用euler方法及其改進方法求解常微分方程初值問題,更進一步掌握常微分方程及其數值解法課程的理論內容,加深對數值解法的理解。2 熟悉matlab程式設計環境。實驗內容 1.實驗題目 運用euler方法及其改進方法求解常微分方程初值問題...

MATLAB實驗報告 常微分方程數值解

專業序號姓名日期 實驗3 常微分方程數值解 實驗目的 1 掌握用matlab求微分方程初值問題數值解的方法 2 通過例項學習微分方程模型解決簡化的實際問題 3 了解尤拉方法和龍格庫塔方法的基本思想。實驗內容 用尤拉方法和龍格庫塔方法求下列微分方程初值問題的數值解,畫出解的圖形,對結果進行分析比較 解...

微分方程數值解實驗

課程設計報告 班級姓名學號 成績 2017年 6月 21 日 目錄一 摘要 1 二 常微分方程數值解 2 2.1 4階runge kutta法和adams4階外插法的基本思路 2 2.2 演算法流程圖 2 2.3 用matlab編寫源程式 2 2.4 常微分方程數值解法應用舉例 4 三 常係數擴散方...