偏微分方程数值算法和matlab实验报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

偏微分方程数值实验报告六

实验题目:

用Ritz-Galerkin 方法求边值问题

2

(0)0,(1)1

u u x u u ''-+===⎧⎨⎩01x << 的第n 次近似()n u x ,基函数为(),i 1,2,.()..x n i sin i x πφ==并用表格列出0.25,0.5,0.75三点处的真解和1,2,3,4n =时的数值解。 实验算法:

将上述边值问题转化为基于虚功方程的变分问题为: 求

10()u H I ∈,满足1

0(,)(,(v H ,))a u v x x I ∀∈=-

其中

11

00

(u''v uv)(,)(,)dx (u'v'uv)dx a u v Lu v +=-+==⎰⎰ 记(x)sin()w x π=,引入10()H I 的n 维近似子空间12{,},,n n U φφφ=⋯(),i 1,2,,i sin i x n πφ==⋯利用Ritz-Galerkin 公式:1()(f,),j 1,,,2,n j i j

j a n φφφ==⋯=∑,则问题关于n U 下的近似变分问题解

1()()n i i n i c u x x φ==∑中的系数12(,,,)T n

n c c c c =⋯∈满足12()(,,)n j i j j a x φφφ==∑

程序代码:

%主函数

pde=modeldata();

I=[0,1];

%积分精度

quadorder=10;

n=[1,2,3,4];

for i=1:length(n)

uh{i}=Galerkin(pde,I,n(i),quadorder); end

showsolution(uh{1},'-bo');

hold on

showsolution(uh{2},'-rx');

hold on

showsolution(uh{3},'-.ko');

hold on

showsolution(uh{4},'--k*');

hold off

title('the solution of the un');

xlabel('x');

ylabel('u');

legend('n=1','n=2','n=3','n=4');

%计算这三点的数值解

x=[1/4,1/2,3/4];

un=zeros(length(n),3);

for i=1:length(n)

[v, ]=basis(x,n(i));

un(i,:)=(v'*uh{i})';

end

format shorte

disp('un');

disp(un);

%存储数据

function pde=modeldata()

pde=struct('f',@f);

function z=f(x)

z=x.*x;

end

end

%Galerkin方法

function uh=Galerkin(pde,I,n,quadorder) h=I(2)-I(1);

[lambda,weight]=quadpts1d(I,quadorder);

nQuad=length(weight);

A=zeros(n,n);

b=zeros(n,1);

for q=1:nQuad

gx=lambda(q);

w=weight(q);

x=[0.25;0.5;0.75];

[phi,gradPhi]=basis(gx,n);

A=A+(-gradPhi*gradPhi'+phi*phi')*w; b=b+pde.f(gx)*phi*w;

end

A=h*A;

b=h*b;

uh=A\b;

end

%构造基函数

function [phi,gradPhi]=basis(x,n)

m=length(x);

w=sin(pi*x);

v=ones(n,m);

v(2:end,:)=bsxfun(@times,v(2:end,:),x);

v=cumprod(v,1);

phi=bsxfun(@times,v,w);

gw=pi*cos(pi*x);

gv=[zeros(1,m);v(1:end-1,:)];

gv(3:end,:)=bsxfun(@times,(2:n-1)',gv(3:end,:)); gradPhi=bsxfun(@times,v,gw)+bsxfun(@times,gv,w); end

%数值解的图像

function showsolution(u,varargin)

x=0:0.01:1;

n=length(u);

[v, ]=basis(x,n);

y=v'*u;

plot(x,y,varargin{:});

% varargin: an input variable in a function

end

%系数矩阵A

function [lambda,weight] = quadpts1d(I,quadorder)

numPts = ceil((quadorder+1)/2);

if numPts> 10

numPts = 10;

end

switch numPts

case 1

A = [0 2.0000000000000000000000000];

case 2

A = [0.5773502691896257645091488

1.0000000000000000000000000

-0.5773502691896257645091488

1.0000000000000000000000000];

case 3

A = [ 0

0.8888888888888888888888889

0.7745966692414833770358531

0.5555555555555555555555556

相关文档
最新文档