Matlab-Self-adjoint elliptic PDE代码解析

1. PDE

∇ ⋅ ( p ( x , y ) ∇ u ) − q ( x , y ) u = f ( x , y ) , x ∈ ( − π / 2 , π / 2 ) , y ∈ ( π / 2 , π ) , p ( x , y ) = x + y q ( x , y ) = x 2 + y 2 f ( x , y ) = cos ⁡ x cos ⁡ y − sin ⁡ x sin ⁡ y − cos ⁡ x sin ⁡ y ( x 2 + y 2 ) − 2 cos ⁡ x sin ⁡ y ( x + y ) , ∂ u ∂ x = sin ⁡ y ,  on  x = − π / 2 , u = 0 ,  on  x = π / 2 u = cos ⁡ x ,  on  y = π / 2 u = 0 ,  on  y = π \nabla \cdot(p(x, y) \nabla u)-q(x, y) u=f(x, y), \quad x \in(-\pi / 2, \pi / 2), \quad y \in(\pi / 2, \pi), \\ p(x, y)=x+y \\ q(x, y)=x^2+y^2 \\ f(x, y)=\cos x \cos y-\sin x \sin y-\cos x \sin y\left(x^2+y^2\right)-2 \cos x \sin y(x+y), \\ \frac{\partial u}{\partial x}=\sin y, \quad \text { on } \quad x=-\pi / 2, \\ u=0, \quad \text { on } \quad x=\pi / 2 \\ u=\cos x, \quad \text { on } \quad y=\pi / 2 \\ u=0, \quad \text { on } \quad y=\pi (p(x,y)u)q(x,y)u=f(x,y),x(π/2,π/2),y(π/2,π),p(x,y)=x+yq(x,y)=x2+y2f(x,y)=cosxcosysinxsinycosxsiny(x2+y2)2cosxsiny(x+y),xu=siny, on x=π/2,u=0, on x=π/2u=cosx, on y=π/2u=0, on y=π
Remark: exact solution is u ( x , y ) = cos ⁡ x sin ⁡ y u(x,y) = \cos x \sin y u(x,y)=cosxsiny

2. FDM

p i + 1 2 , j U i + 1 , j − ( p i + 1 2 , j + p i − 1 2 , j ) U i j + p i − 1 2 , j U i − 1 , j h x 2 + p i , j + 1 2 U i , j + 1 − ( p i , j + 1 2 + p i , j − 1 2 ) U i j + p i , j − 1 2 U i , j − 1 h y 2 − q i j U i j = f i j \frac{p_{i+\frac{1}{2}, j} U_{i+1, j}-\left(p_{i+\frac{1}{2}, j}+p_{i-\frac{1}{2}, j}\right) U_{i j}+p_{i-\frac{1}{2}, j} U_{i-1, j}}{h_x^2} \\ +\frac{p_{i, j+\frac{1}{2}} U_{i, j+1}-\left(p_{i, j+\frac{1}{2}}+p_{i, j-\frac{1}{2}}\right) U_{i j}+p_{i, j-\frac{1}{2}} U_{i, j-1}}{h_y^2} -q_{i j} U_{i j}=f_{i j} hx2pi+21,jUi+1,j(pi+21,j+pi21,j)Uij+pi21,jUi1,j+hy2pi,j+21Ui,j+1(pi,j+21+pi,j21)Uij+pi,j21Ui,j1qijUij=fij
也可以写成
p i + 1 2 , j h x 2 U i + 1 , j + p i − 1 2 , j h x 2 U i − 1 , j + p i , j + 1 2 h y 2 U i , j + 1 + p i , j − 1 2 h y 2 U i , j − 1 + ( − ( p i + 1 2 , j + p i − 1 2 , j ) h x 2 − ( p i , j + 1 2 + p i , j − 1 2 ) h y 2 − q i j ) U i j = f i j \frac{p_{i+\frac{1}{2}, j}}{h_x^2} U_{i+1, j} + \frac{p_{i-\frac{1}{2}, j}}{h_x^2} U_{i-1, j} + \frac{p_{i, j+\frac{1}{2}}}{h_y^2} U_{i, j+1} + \frac{p_{i, j-\frac{1}{2}}}{h_y^2} U_{i, j-1} \\+ \left(- \frac{\left(p_{i+\frac{1}{2}, j}+p_{i-\frac{1}{2}, j}\right)}{h_x^2} -\frac{\left(p_{i, j+\frac{1}{2}}+p_{i, j-\frac{1}{2}}\right)}{h_y^2} -q_{i j}\right) U_{i j}=f_{i j} hx2pi+21,jUi+1,j+hx2pi21,jUi1,j+hy2pi,j+21Ui,j+1+hy2pi,j21Ui,j1+ hx2(pi+21,j+pi21,j)hy2(pi,j+21+pi,j21)qij Uij=fij

3.Matlab Code

初始化

clearvars;
close all;
clc;

a = -0.5*pi; b= 0.5*pi; c = pi/2; d=pi;

m=128; n=128;

hx = (b-a)/m; hx1 = hx*hx; x=zeros(m+1,1);
for i=1:m+1
  x(i) = a + (i-1)*hx;
end

hy = (d-c)/n; hy1 = hy*hy; y=zeros(n+1,1);
for i=1:n+1
  y(i) = c + (i-1)*hy;
end

M = (n-1)*m; A = sparse(M,M); bf = zeros(M,1);

在这里插入图片描述

for j = 1:n-1
  for i=1:m
    k = i + (j-1)*m;
    bf(k) = f(x(i),y(j+1));
    p1=p(x(i)+hx/2,y(j+1))+p(x(i)-hx/2,y(j+1));
    p2=p(x(i),y(j+1)+hy/2)+p(x(i),y(j+1)-hy/2);
    A(k,k) = -p1/hx1-p2/hy1-q(x(i),y(j+1));

对于left boundary condition(Neumann):

在这里插入图片描述

if i == 1
        A(k,k+1) = p1/hx1;
        bf(k) = bf(k) + 2*p(x(i)-hx/2,y(j+1))*ux(y(j+1))/hx;

对于right boundary condition:

在这里插入图片描述

 else
       if i==m
         A(k,k-1) = p(x(i)-hx/2,y(j+1))/hx1;
         bf(k) = bf(k) - p(x(i)+hx/2,y(j+1))*ue(x(i+1),y(j+1))/hx1;

对于x方向(lb和rb除外):

在这里插入图片描述

       else
	  A(k,k-1) = p(x(i)-hx/2,y(j+1))/hx1;
	  A(k,k+1) = p(x(i)+hx/2,y(j+1))/hx1;
       end
    end

对于lower boundary condition:

在这里插入图片描述

if j == 1
        A(k,k+m) = p(x(i),y(j+1)+hy/2)/hy1;
         bf(k) = bf(k) -p(x(i),y(j+1)-hy/2)*ue(x(i),c)/hy1;

对于upper boundary condition:

在这里插入图片描述

else
       if j==n-1
         A(k,k-m) = p(x(i),y(j+1)-hy/2)/hy1;
          bf(k) = bf(k) -p(x(i),y(j+1)+hy/2)*ue(x(i),d)/hy1;

对于y方向(lowerb和ub除外):

在这里插入图片描述

else
          A(k,k-m) = p(x(i),y(j+1)-hy/2)/hy1;
          A(k,k+m) = p(x(i),y(j+1)+hy/2)/hy1;
       end
     end

  end
end

利用AU = F 求解

U = A \bf;

画图

%--- Transform back to (i,j) form to plot the solution ---


j = 1;
for k=1:M
  i = k - (j-1)*m ;
  u(i,j) = U(k);
  u2(i,j) = ue(x(i),y(j+1));
  j = fix(k/m) + 1;
end

% Analyze abd Visualize the result.

e = max( max( abs(u-u2)))        % The maximum error
x1=x(1:m); y1=y(2:n);

mesh(y1,x1,u);
title('The solution plot');
xlabel('y');
ylabel('x');
figure(2);
mesh(y1,x1,u-u2);
title('The error plot');
xlabel('y');
ylabel('x');

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值