matlab编写微分方程椭圆型方程(一维形式)

理论

椭圆型方程一维格式即常微分方程,边值问题,方程如下所示:

在这里插入图片描述
在这里插入图片描述
截断误差:
在这里插入图片描述

h → ∞ h\rightarrow\infty h时,截断误差趋于零,离散方程组成立,
在这里插入图片描述
写成矩阵:
在这里插入图片描述
用离散化方程组求解:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

编程实例

在这里插入图片描述
对比:
在这里插入图片描述

边值条件:

% boundary conditions
u0 = 1;
uN = exp(1);

区域的划分:

% partion of the domain
N = 20;
h = 1/N;
x_all = (0:h:1)';
x = x_all(2:end-1);

代入d:
在这里插入图片描述

% the right hand side
d = fx(x);
d(1) = d(1) + u0/h^2;
d(N-1) = d(N-1) + uN/h^2;

其中:

function y = fx (x)
y = (x-1).*exp(x);
end

thomas算法:

% thomas algorithm
u = thomas (a,b,c,d);

在这里插入图片描述
在这里插入图片描述

function u = thomas(a, b, c, d)
M = length(a);
u = zeros(M,1);
e = zeros(M,1);
f = zeros(M,1);
e(1) = c(1)/b(1);
f(1) = d(1)/b(1);

% forward
for i = 2:M
    e(i) = c(i)/( b(i)-a(i)*e(i-1));
    f(i) = (d(i)+a(i)*f(i-1))/(b(i)-a(i)*e(i-1));
end

在这里插入图片描述

%backward
u(M) = f(M);
for i = M-1:-1:1
    u(i) = f(i) + e(i)*u(i+1);
end
end

计算真解:

% the exact solution
u_e = u_exact(x_all);

原代码

% boundary conditions
u0 = 1;
uN = exp(1);

% partion of the domain
N = 20;
h = 1/N;
x_all = (0:h:1)';
x = x_all(2:end-1);

% the right hand side
d = fx(x);
d(1) = d(1) + u0/h^2;
d(N-1) = d(N-1) + uN/h^2;

% diagonals of the coefficient matrix A
q = qx(x);
a = ones (N-1,1)/h^2;
b = 2*ones (N-1,1)/h^2 + q;
c = a;

% thomas algorithm
u = thomas (a,b,c,d);

% A = spdiags([-a b -c],[-1 0 1],N-1,N-1);
% u = A\d;

% the exact solution
u_e = u_exact(x_all);

figure(1)
plot(x_all,[u0;u;uN],'g*',x_all,u_e,'r');
% end
%——--subroutines-
function y = qx(x)
y = x;
end
 
function y = fx (x)
y = (x-1).*exp(x);
end

function y = u_exact(x)
y = exp(x);
end

function u = thomas(a, b, c, d)
M = length(a);
u = zeros(M,1);
e = zeros(M,1);
f = zeros(M,1);
e(1) = c(1)/b(1);
f(1) = d(1)/b(1);

% forward
for i = 2:M
    e(i) = c(i)/( b(i)-a(i)*e(i-1));
    f(i) = (d(i)+a(i)*f(i-1))/(b(i)-a(i)*e(i-1));
end

%backward
u(M) = f(M);
for i = M-1:-1:1
    u(i) = f(i) + e(i)*u(i+1);
end
end

输出结果:
在这里插入图片描述

  • 6
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
二维椭圆偏微分方程是一类常见的数学模型,可以用于描述许多现实世界中的问题,如热传导、流体力学等。而求解这类方程的一次和二次有限元方法是常用的数值求解方法之一。 在Matlab中,可以通过编写相应的程序来实现一次和二次有限元方法的求解过程。首先,需要将二维椭圆偏微分方程离散化为有限元形式,得到一组代数方程。然后,我们可以使用一次或二次有限元方法建立线性或二次插值函数空间,并将离散化后的方程表示为矩阵方程。 对于一次有限元方法,我们使用线性插值函数空间,在Matlab中通常使用`linearshape`函数来定义线性插值。然后,我们可以通过组装刚度矩阵和载荷矩阵得到一个线性方程组,再使用`mldivide`函数求解该方程组。 对于二次有限元方法,我们使用二次插值函数空间,在Matlab中通常使用`quadraticshape`函数来定义二次插值。同样地,我们可以通过组装刚度矩阵和载荷矩阵得到一个二次方程组,再使用`mldivide`函数求解该方程组。 此外,为了更好地进行数值计算,我们还可以使用迭代方法,如共轭梯度法或预处理共轭梯度法来加速求解过程。 总之,通过Matlab编写的一次和二次有限元方法可以较为准确地求解二维椭圆偏微分方程,是一种常用的数值求解方法。在实际应用中,我们还可以通过调节网格密度、选择合适的插值函数和使用更高阶的有限元方法来改进计算结果的精度。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值