matlab求解三对角方程组

在求解偏微分方程时,最经典的就是热传导方程的求解。
求解方法普遍采用隐格式。差分之后很显然会得到下图所示的三对角矩阵:
在这里插入图片描述求解三对角矩阵有很多方法,下面只列举两种方法
1、直接求解
行如上面的矩阵,编写代码如下:

n = n0-1;
a2 = sparse(2:n,1:n-1,ones(1,n-1)*(-r),n,n);
a1 = sparse(1:n,1:n,(1+2*r)*ones(1,n),n,n);
a = a1+a2+a2';
for i = 1:n-1
	b(i,1) = u(i,j)
end
b(1) = u(1,j)+rg1;
b(n-1) = u(n-1,j)+rg2;
x = a\b;

2、追赶法

function [L,U,x]=crout(a,c,d,b)%数组a存储三角矩阵A的主对角线元素,c、d存储主对角线上边下边带宽为1的元素
    n=length(a)
    n1=length(c)
    n2=length(d)
    %错误检查
    if n1~=n2%存储矩阵的数组维数错误
        error('MATLAB:Crout:不是三对角矩阵,参数数组中元素个数错误.');
    elseif n~=n1+1
        error('MATLAB:Crout:不是三对角矩阵,参数数组中元素个数错误.');
    end
   
    %初始化
    L=zeros(n);%生成n*n的全零矩阵
    U=zeros(n);
    p=1:n;
    q=1:n-1;
    x=1:n;
    y=1:n;
   
    %追赶法程序主体
    p(1)=a(1);
    for i=1:n-1
        q(i)=c(i)/p(i);
        p(i+1)=a(i+1)-d(i)*q(i);%d的下标改为1到n-1
    end
    %正解y
    y(1)=b(1)/p(1);%用x存储y
    for i=2:n
        y(i)=(b(i)-d(i-1)*y(i-1))/p(i);
    end
    %倒解x
    x(n)=y(n);
    for i=(n-1):-1:1
        x(i)=y(i)-q(i)*x(i+1);
    end
    %L,U矩阵
    for i=1:n
        L(i,i)=p(i);
        U(i,i)=1;
    end
    for i=1:n-1
        L(i+1,i)=d(i);
        U(i,i+1)=q(i);
end %end of function


为了验证两种方法的效果,编写算例:

%% 稀疏矩阵的算例
n = 10;
a2 =  sparse(2:n,1:n-1,ones(1,n-1),n,n)
a1 = sparse(1:n,1:n,4*ones(1,n),n,n);
a = a1+a2+a2';
b = ones(n,1);
x1 = a\b;

a4 = 4*ones(1,n);
a3 =  ones(1,n-1);
[L,U,x2]=crout(a4,a3,a3',b);

x = x1'-x2

计算结果发现:
x =

1.0e-16 *

     0         0         0         0    0.2776   -0.2776         0         0         0         0

结果几乎一样,所以在实际求解中完全可以采用直接求解法。
PS:我的零食小屋开业啦!有想吃零食的欢迎找我!
有辣辣的,干果还有甜品和水果哦!vx:li1360347cn

可以使用追赶法(也称托马斯算法)来求解对角方程组。在MATLAB中,可以使用“tridiag”函数来实现此算法。具体步骤如下: 1. 将对角方程组表示为以下形式:Ax = d,其中A是一个对角矩阵,d是一个列向量,x是要求解的未知向量。 2. 对于对角矩阵A,将其拆分为个向量:a、b和c。向量a和c分别表示矩阵A的下对角线和上对角线,向量b表示矩阵A的主对角线。 3. 对向量a、b和c进行追赶法求解。具体来说,首先需要进行一次前向追赶,然后再进行一次后向追赶。在前向追赶中,需要求解一个新的向量y,使得Ly = d,其中L是一个下角矩阵。在后向追赶中,需要求解向量x,使得Ux = y,其中U是一个上角矩阵。 4. 将求解得到的向量x返回作为结果。 下面是一个MATLAB代码示例: ```matlab function x = tridiag(a,b,c,d) % Tridiagonal matrix algorithm (Thomas algorithm) % Inputs: a, b, c - the three diagonals of the matrix A % d - the right-hand side vector % Output: x - the solution vector % Forward elimination (L*y = d) n = length(d); y = zeros(n,1); for i = 2:n w = a(i) / b(i-1); b(i) = b(i) - w*c(i-1); d(i) = d(i) - w*d(i-1); end % Backward substitution (U*x = y) y(n) = d(n) / b(n); for i = n-1:-1:1 y(i) = (d(i) - c(i)*y(i+1)) / b(i); end x = y; end ``` 使用方法: 假设有一个对角方程组Ax=d,其中A是一个3×3的对角矩阵,d是一个长度为3的列向量。可以使用以下代码来求解未知向量x: ```matlab a = [0, 2, 1]; b = [3, 2, 1]; c = [1, 2, 0]; d = [7; 4; 1]; x = tridiag(a, b, c, d); ``` 其中,向量a、b和c分别对应矩阵A的下对角线、主对角线和上对角线,向量d是方程组的右侧向量。函数“tridiag”将返回向量x,即方程组的解。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值