微分方程数值方法课程设计
姓名:康 洋 班级:信息与计算科学 1 班
目录
椭圆型方程 .............................................................................3
· 设计题目、原理: .....................................................3
· 设计思路、算法步骤:............................................. 4
· 函数文件、命令文件:............................................. 4
· 对计算过程与结果的分析: ..................................... 9
抛物线方程 ...........................................................................10
· 设计题目、原理: ...................................................11
· 函数文件、命令文件:........................................... 12
· 对计算过程与结果的分析: ....................................15
双曲线方程 ...........................................................................17
· 设计题目、原理: ...................................................17
· 函数文件、命令文件:........................................... 20
· 对计算过程与结果的分析: ....................................23
课程体会心得.......................................................................23
椭圆型方程
编程计算:采用五点差分格式求如下椭圆型方程:
;
f (x, y),
(x, y)
2
u
2
x
2
u
2
y
其中f (x, y) 、 及边条件为:
f (x, y)
u(x,0)
u(0, y)
,且边条件如下:
(0,2)
(0,1)
4,
2
2
x 1;
(x 2)
0
x , u(x,2)
,
2
2
(y 1) , 0
2.
y
y , u(1, y)
)
( ,
)
(
x
y
u x y
2
问题存在精确解为:
· 设计题目、原理:
为了说明对椭圆型方程边值问题建立差分格式的过程,首先考虑
方程的离散化,在矩形区域
上,对于如题
Poisson 方程的差分格式离散化,我们可以采用中心差商代替导数:
将以上两式代入 Poisson 方程化简得:
之后写成矩阵形式:
通过解方程组的方法求出数值解。
· 设计思路、算法步骤:
算法步骤就是要用代码表示出 H 矩阵和 g 向量,之后解出 的值
即为精确解的数值近似。
· 函数文件、命令文件:
function [g,u0]=fivepointdiff(x1,x2,y1,y2,M,N)
%变步长法,g 是数值解,u0 是精确解
h=abs(x1-x2)/M;
k=abs(y1-y2)/N;
m=M-1;
n=N-1;
h1=h^2;
r=h1/k^2;
t=2+2*r;
%横轴步长
%纵轴步长
%五点中的上下两个点的系数
%五点中的中心点的系数
x=x1+(x2-x1)*(0:M)/M;
%x,y 向量表示横纵坐标
y=y1+(y2-y1)*(0:N)/N;
a=zeros(m*n,m*n);
b=zeros(m*n,1);%初始化 a,b 矩阵,a 为系数矩阵
%内部的(m-2)*(n-2)个点
for i=2:m-1
for j=2:n-1
a(i+(j-1)*m,:)=[zeros(1,i-1+(j-2)*m)
-r zeros(1,m-2)
-1 t
-1
zeros(1,m-2) -r zeros(1,(n-j)*m-i)];
b(i+(j-1)*m)=h1*f(x(i+1),y(j+1));
end
end
%下边界
j=1;
for i=2:m-1
a(i+(j-1)*m,:)=[zeros(1,i-2) -1 t -1 zeros(1,m-2) -r zeros(1,(n-j)*m-i)];
b(i+(j-1)*m)=h1*f(x(i+1),y(j+1))+r*bottom(x(i+1));
end;
%右边界
i=m;
for j=2:n-1
a(i+(j-1)*m,:)=[zeros(1,(j-1)*m-1) -r zeros(1,m-2) -1 t zeros(1,m-1) -r
zeros(1,(n-j)*m-i)];
b(i+(j-1)*m)=h1*f(x(i+1),y(j+1))+right(y(j+1));
end
%上边界
j=n;
for i=2:m-1
a(i+(j-1)*m,:)=[zeros(1,i-1+(j-2)*m)
-r
zeros(1,m-2)
-1
t
-1
zeros(1,m-i-1)];
b(i+(j-1)*m)=h1*f(x(i+1),y(j+1))+r*top(x(i+1));
end
%左边界
i=1;
for j=2:n-1
a(i+(j-1)*m,:)=[zeros(1,i-1+(j-2)*m) -r zeros(1,m-1) t -1 zeros(1,m-2)
-r
zeros(1,(n-j)*m-i)];
b(i+(j-1)*m)=h1*f(x(i+1),y(j+1))+left(y(j+1));
end;
%左下角的那个点
i=1;j=1;
a(1,:)=[t -1 zeros(1,m-2) -r zeros(1,(n-1)*m-1)];
b(1)=h1*f(x(2),y(2))+r*bottom(x(2))+left(y(2));
%右下角的那个点
i=m;j=1;
a(i+(j-1)*m,:)=[zeros(1,m-2) -1 t zeros(1,m-1) -r zeros(1,(n-2)*m)];
b(i+(j-1)*m)=h1*f(x(i+1),y(j+1))+r*bottom(x(i+1))+right(y(j+1));
%左上角的那个点
i=1;j=n;
a(i+(j-1)*m,:)=[zeros(1,(n-2)*m) -r zeros(1,m-1) t -1 zeros(1,m-2)];
b(i+(j-1)*m)=h1*f(x(i+1),y(j+1))+r*top(x(i+1))+left(y(j+1));
%右上角的那个点
i=m;j=n;
a(i+(j-1)*m,:)=[zeros(1,(n-1)*m-1) -r zeros(1,m-2) -1 t];
b(i+(j-1)*m)=h1*f(x(i+1),y(j+1))+r*top(x(i+1))+right(y(j+1));
u=a\b;
g=zhengli(u,N,M);
ux=jie1(M,N,h,k);
u0=ux';
function k=bottom(x)
%下边界函数
k=x^2;
function k=right(y)
%右边界函数
k=(y-1)^2;
function k=top(x)
%上边界函数
k=(x-2)^2;
function k=left(y)
%左边界函数
k=y^2;
function k=f(x,y)
%f(x,y)函数
k=-4;
function k=jie(x,y)
%精确解
k=(x-y)^2;
function u0=jie1(M,N,h,k)
%将精确解表示为矩阵形式
for i=1:M-1
for j=1:N-1
u0(i,j)=jie(j*h,i*k);
end
end
function g=zhengli(u,N,M)
%由于求得 u 是向量,故该函数将 u 表示成矩阵
j=1;
t=1;
for i=1:(N-1)*(M-1)
g(t,j)=u(i);
t=t+1;
if(mod(i,M-1)==0)
j=j+1;
t=1;
end
end