微分方程數值方法實驗報告

2021-07-24 21:34:45 字數 3774 閱讀 8515

一、實驗題目

(1)用ritz-galerkin方法求解邊值問題

精確解(2)用有限元方法求解

二、實驗目的

運用matlab數學軟體編寫ritz-galerkin方法和有限元方法程式,進一步熟悉matlab的應用及掌握偏微分方程數值方法中ritz-galerkin方法和有限元方法,對各個方法求解精度進一步明確。

三、實驗原理

(1)ritz-galerkin方法

ritz方法

設給出二次泛函

(1)其中是hilbert空間v上的雙線性泛函,而且滿足對稱性、有界性、正定性;是v上的有界線性泛函。考慮一下變分問題:求滿足

2)設hilbert空間v是可分的,即v中有可數多個元素構成乙個稠密集。在v中取n個線性無關的元素,他們張成乙個n維子空間,即,或記成3)

上述元素稱為空間的基.

用代替v,在上求泛函的極小,即求滿足

4)顯然,原先的變分問題(2)與後面的變分問題(4)是不同的,他們的解也是不同的。如果v的子空間充分接近v,那麼,用代替v而得到的解也就充分接近u,從而把作為原變分問題的近似解,亦即把無窮維空間v中的極值問題近似為有限維空間中的極值問題,這就是ritz方法得基本思想。

問題(4)很容易化為乙個線性代數方程組問題。實際上,每乙個中的元素都可以用的線性組合表示,故,這時,由及的性質

,因此,是乙個以為變數的二次多項式。由於雙線性泛函是對稱、正定的,則二次項

是乙個以為變數的正定二次型,即矩陣是對稱正定的。因此,在點取得極小的充分必要條件是。

可以算出,上式即,即n維向量是線性方程組的解,其中。求出之後,即得近似變分問題(4)的解

總之,ritz法吧泛函的極小值問題化為多元二次函式的極小值問題,最後通過求解乙個線性代數方程組而得出變分問題的近似解。

galerkin方法

當雙線性泛函對稱時,變分問題(2)等價於變分方程:求使得(5)

galerkin方法是一種求解變分方程(5)的近似方法。假設v是可分的hilbert空間,仍然取有限維子空間為。考慮近似變分方程:求滿足6)

需要注意的是,近似變分方程(6)的解中,且檢驗函式v只要求對中的元素成立而不是對v中的一切元素成立。

這時,求解仍然化為求解乙個線性方程組。因為中的元素仍是通過的線性組合來表示,可以設,代入式(6)得

或者由的任意性,即得任意性,可得出線性代數方程組

由於雙線性泛函是對稱的,所以該線性方程組與ritz得到的線性方程組是相同的。

(1)有限元方法

考慮兩點邊值問題(p)

其中,且,, (記),常數,為已知常數。

根據邊界條件,定義空間

構造空間v的有限維子空間線性無關的函式集合,使它成為空間的基。

引入空間上的雙線性泛函

和線性泛函

於是,有限元方法求關於問題(p)的解可以表示為

把區間剖分,然後作定義在區間、支集在和上的「山形」函式:

顯然線性無關,而且滿足,故由張成的子空間。

容易驗證

所以,如果給出節點上的未知函式值,那麼,在中的近似解就是。

我們的問題是:求使得

這相當於:求使得

定義矩陣

,, 則

可求出所以邊值問題的近似解為

四、實驗步驟

(1)ritz-galerkin方法

clear all

n=2;h=(1-0)/n;

syms x;

for i=1:n

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

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

endfai;

for 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);

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

endc=inv(a)*f';

product=c.*fai';

c;h1=1/10;

sum=0;

for i=1:n

sum=sum+product(i);

endvu=;

for y=0:h1:1

v=subs(sum,x,y);

vu=[vu,v];

endy=0:h1:1;

yy=0:0.001:1;

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

plot(yy,u,'-',y,vu,'o-');

u=vpa(u,5)

vu=vpa(vu,5)

iwanttoknow=abs(u-vu);

結果如下:

表1數值解與近似解對照表

圖1數值解與近似解對照圖

(2)有限元方法

clear all

syms x

n=5;h=1/(n+1);

for i=1:n

fai1(i)=1+(x-i*h)/h;

posai1(i)=diff(fai1(i));

fai2(i)=1+(i*h-x)/h;

posai2(i)=diff(fai2(i));

enda=zeros(n,n);

func111=posai1(1)^2+fai1(1)^2;func112=posai2(1)^2+fai2(1)^2;

a(1,1)=int(func111,x,0,h)+int(func112,x,h,2*h);

func12=posai2(1)*posai1(2)+fai2(1)*fai1(2);

a(1,2)=int(func12,x,h,2*h);

for i=2:n-1

func111=posai1(i)^2+fai1(i)^2;func112=posai2(i)^2+fai2(i)^2;

a(i,i)=int(func111,x,(i-1)*h,i*h)+int(func112,x,i*h,(i+1)*h);

func12=posai2(i)*posai1(i+1)+fai2(i)*fai1(i+1);

a(i,i+1)=int(func12,x,i*h,(i+1)*h);

func21=posai1(i)*posai2(i-1)+fai1(i)*fai2(i-1);

a(i,i-1)=int(func21,x,(i-1)*h,i*h);

endi=n;

func111=posai1(i)^2+fai1(i)^2;func112=posai2(i)^2+fai2(i)^2;

a(i,i)=int(func111,x,(i-1)*h,i*h)+int(func112,x,i*h,(i+1)*h);

func21=posai1(i)*posai2(i-1)+fai1(i)*fai2(i-1);

a(i,i-1)=int(func21,x,(i-1)*h,i*h);

for i=1:n

funcb1=fai1(i)*(1+pi^2)*sin(pi*x); funcb2=fai2(i)*(1+pi^2)*sin(pi*x);

b(i)=int(funcb1,x,(i-1)*h,i*h)+int(funcb2,x,i*h,(i+1)*h);

endb=b';

a;u=inv(a)*b;

u=vpa(u,5);

u=u';

x=h:h:1-h;

xx=0:0.001:1;

y=sin(pi*xx);

plot(xx,y,'-',x,u,'o-')

結果如下:

表2數值解與近似解對照表

圖2數值解與近似解對照圖

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

for k 2 n yp y k 1,h feval f,x k 1 y k 1,yc y k 1,h feval f,x k yp y k,yp yc 2 end 3 runge kutta method function tout,yout runge kutta f,ab,y0,h tout ...

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

學院 數學與資訊科學 專業 資訊與計算科學 姓名 鄭思義 學號 201216524 課程 常微分方程數值解 實驗一 常微分方程的數值解法 1 分別用euler法 改進的euler法 預報校正格式 和s k法求解初值問題。h 0.1 並與真解作比較。1.1實驗 尤拉法 function x,y nae...

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

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