Gauss消元法matlab实现(原理、代码、案例及详解)

 第一部分:问题分析

(1)实验题目:高斯消元算法

具体实验要求:要求学生运用高斯列主元消元法计算出线性方程组Ax=b的近似解。用matlab编写高斯列主元消元法的代码,要求代码实现用户输入了矩阵行列数、稀疏矩阵A、行列式b之后,程序能够输出迭代的近似解。

实验目的:让同学们进一步掌握高斯列主元消元法的原理以及迭代过程,并且通过matlab编程培养实际的上机操作能力和代码能力。

第二部分:数学原理 

列主元素消去法是为控制舍入误差而提出来的一种算法,列主元素消去法计算基本上能控制舍入误差的影响,其基本思想是:在进行第 k(k=1,2,...,n-1)步消元时,从第k列的 akk及其以下的各元素中选取绝对值最大的元素,然后通过行变换将它交换到主元素akk的位置上,再进行消元。该过程运用到了行列式的行变换并不改变行列式的值。

 第三部分:程序设计流程

(1)Gauss消元函数(被调用者):

//ps:几个需要注意的点

1.一般用户输入的右端项b是行向量,需要对b进行一次转置变成列向量

2.col_num = n+1;A(:,col_num) = b;通过该方法获得增广矩阵(即将b列向量赋值给A矩阵的col_num列)

3.设置一个temp行向量作为交换的中介(这是swap的典型例子)

4.别忘记特判!--->当目前找出的该行最大元素为0时,系数矩阵奇异,方程没有唯一解

(2)执行函数(面向用户:调用者):

 第四部分:代码实现

拉格朗日插值函数实现:

(每次最外层的for循环,打印一次插值点以及其期望值)

function[] = Lagrange(x,f,x0)
%得出数据点的个数
n = length(x) ;
%得出插值点的个数
m = length(x0);
    for i = 1:m
    D = x0(i);
    y = 0.0;
    for k = 1:n
    %置l(x)的初值
    l = 1.0;
        for j = 1:n
            %迭代表示出l(xj)
            %记住,第k个是取不到的!!!!
            if j~=k
            l = l*(D-x(j))/(x(k)-x(j));
            end
        end
        %Pn(x)
        y = y + l*f(k);
    end
        xx = num2str(D,'%.4f');
        y =num2str(y,'%.4f');
        disp('f(x)的近似值点坐标为:');
        disp(['(',xx,',',y,')']);
    end
end

 用户调用部分: 

(1)情形一:

(实现结果:给定插值函数的区间,给定原函数f(x),给定插值点-->实现拉格朗日估值的计算)

注意:

1.拉格朗日坐标点的x坐标向量,通过区间加步长实现:所以用户只需修改区间端点,程序便可以根据输入的区间等分次数n,自行合成

2.通过syms x将原函数f(x)表示出来(由用户自己输入),程序便可以根据输入的f(x)自动计算出对应数据节点的函数值 

%根据插值要求,自行算出所需要输出的坐标值
n = input("插值等分的次数n=");
X = -5:(10/n):5;
m = length(X);%获取节点的个数
Y = zeros(1,m);%创造全0向量为插值点函数值做铺垫
syms x;
%在此输入测试的函数f(x)
f(x) = (1+x^2)^(-1);
for i = 1:m
    Y(i) = f(X(i));
end
x0 = input('请输入插值点x0数组:');
Lagrange(X,Y,x0);

(2)情形二:

(实现结果:针对给定的无规律离散数据点,且未给定对应的原函数f(x))

%输入数据点的坐标
x = input("输入数据点x坐标的向量:");
y = input("输入数据点y坐标的向量:");

%输入所要估值的插值点的x坐标向量
x0 = input('请输入插值点x0数组:');

Lagrange(X,Y,x0);

猜你喜欢

转载自blog.csdn.net/m0_56603583/article/details/124240024