MATLAB 与C语言实现追赶法 (托马斯算法)

算法的原理就是类似于LU分解,然后求解线性方程组。具体可以参考https://www.cnblogs.com/xpvincent/archive/2013/01/25/2877411.html

方法一

a = [0,1,1,1]';
b = [4,4,4,4]';
c = [1,1,1]';
x = [1,1,1,0]';
m = zeros(3,1);
n = 4;
c(1) = c(1)/b(1);
x(1) = x(1)/b(1);
for i = 2:n-1
     c(i) = c(i)/(b(i)-c(i-1)*a(i));
end
 for i = 2:n
    x(i) = (x(i)-x(i-1)*a(i))/(b(i)-c(i-1)*a(i));   
end

for i = n-1:-1:1
    x(i) = x(i)-c(i)*x(i+1);
end

方法二 

clear all;clc;
prompt = 'What is the original value? ';
n = input(prompt);
n
a=zeros(1,n);b=zeros(1,n);c=zeros(1,n-1);
A=zeros(n,n);
for i=1:n
    for j=1:n
        if j==i
            A(i,j)=4;
        elseif (j-i==-1)||(j-i==1)
            A(i,j)=1;
        else
            A(i,j)=0;
        end
    end
end
fprintf('系数矩阵:');A
fprintf('主对角线元素:');b=diag(A)'
fprintf('第1条对角线元素:');c=diag(A,1)'
fprintf('第-1条对角线元素:');a(2:n)=c
d=[1,1,1,0];%zeros(1,n);d(1)=1;d(n)=((-1)^(n+1));
fprintf('给定的系数矩阵(转置后):');d
y=zeros(n,1);x=y;
u=zeros(1,n);l=u;%u矩阵U的主对角线元素,l矩阵L的第-1条对角线元素
%---------追过程--------
u(1)=b(1);y(1)=d(1);
for i=2:n
    l(i)=a(i)/u(i-1);
    u(i)=b(i)-l(i)*c(i-1);
    y(i)=d(i)-l(i)*y(i-1);
end
fprintf('中间解向量:');y
fprintf('单位下三角阵L的第-1条对角线元素:');l 
fprintf('上三角阵U的主对角线元素:')
U=zeros(n);
L=eye(n);
for i=1:n-1
    L(i+1,i)=l(i+1);
end
fprintf('单位下三角阵:');%单位下三角阵
 
for i=1:n-1
    U(i,i)=u(i);
    U(i,i+1)=c(i);
end
U(n,n)=u(n);
fprintf('上三角阵:'); 
%---------赶过程--------
x(n)=y(n)/u(n);
for i=n-1:-1:1
    x(i)=(y(i)-c(i)*x(i+1))/u(i);
end
fprintf('解向量:');x

C代码

#include<stdio.h>

void tdma(float x[], const size_t N, const float a[], const float b[], float c[]);
int main()
{
    float x[4] = { 1,1,1,0 };
    int i;
    const size_t N = 4;
    const float a[4] = {0,1,1,1};
    const float b[4] = { 4,4,4,4 };;
    float c[3] = { 1,1,1 };

    tdma(x ,N,a ,b ,c );
    for ( i = 0; i < N; i++)
    {
        printf("%f ", x[i]);
    }  
    return 0;
} 

void tdma(float x[], const size_t N, const float a[], const float b[], float c[])
{
    size_t n;

    c[0] = c[0] / b[0];
    x[0] = x[0] / b[0];

    for (n = 1; n < N-1; n++) {
         
        c[n] = c[n] / (b[n] - a[n] * c[n - 1]);
    }
    for (n = 1; n < N ; n++) {
         
        x[n] = (x[n] - a[n] * x[n - 1]) /(b[n] - a[n] * c[n - 1]);
    }

    for (n = N -2; n-- > 0; )
        x[n] = x[n] - c[n] * x[n + 1];
}

 

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值