数值分析原理课程实验——(高斯)Gauss列主元消去法

高斯(Gauss)列主元消去法

方法概要

在这里插入图片描述

待求问题

在这里插入图片描述

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

程序流程

在这里插入图片描述

程序代码

/*Matlab函数
function Result = Gauss(n, A, b)
    for k = 1:n-1
        max = abs(A(k, k));
        p = k;
        for j = k+1:n
            if(abs(A(j, k)) > max)
                max = abs(A(j, k));
                p = j;
            end
        end
        if(A(p, k) == 0)
            Result = 'Singular matrix!';
            return;
        end
        if(p ~= k)
           A([k p], :) = A([p k], :);
           b([k p], :) = b([p k], :);
        end
        for i = k+1:n
            Mik = A(i, k)/A(k, k);
            for j = k:n
                A(i, j) = A(i, j) - A(k, j)*Mik;
            end
            b(i) = b(i) - b(k)*Mik;
        end
    end
    if(A(n, n) == 0)
        Result = 'Singular matrix!';
        return;
    end
    Result = zeros(n, 1);
    Result(n, 1) = b(n)/A(n, n);
    for k = n-1:-1:1
        Sum = 0;
        for j = k+1:n
            Sum = Sum + A(k, j)*Result(j, 1);
        end
        Result(k, 1) = (b(k) - Sum)/A(k, k);
    end
end*/

/*C语言程序
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#define N 10

int n;
double a[N][N], b[N], x[N];

int main() {
    scanf("%d", &n);
    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= n; j++) scanf("%lf", &a[i][j]);
    for (int i = 1; i <= n; i++) scanf("%lf", &b[i]);
    for (int k = 1; k < n; k++) {
        int p = k;
        double maxabs = fabs(a[k][k]);
        for (int j = k + 1; j <= n; j++)
            if (fabs(a[j][k]) - maxabs > 0) {
                p = j;
                maxabs = fabs(a[j][k]);
            }
        if (a[p][k] == 0) {
            printf("Singular");
            return 0;
        }
        if (p != k) {
            double tmp;
            for (int j = 1; j <= n; j++) {
                tmp = a[p][j];
                a[p][j] = a[k][j];
                a[k][j] = tmp;
            }
            tmp = b[p];
            b[p] = b[k];
            b[k] = tmp;
        }
        for (int i = k + 1; i <= n; i++) {
            double m_ik = a[i][k] / a[k][k];
            for (int j = k + 1; j <= n; j++) a[i][j] -= a[k][j] * m_ik;
            b[i] -= b[k] * m_ik;
        }
    }
    if (a[n][n] == 0) {
        printf("Singular");
        return 0;
    }
    x[n] = b[n] / a[n][n];
    for (int k = n - 1; k >= 1; k--) {
        double sigma = 0.0;
        for (int j = k + 1; j <= n; j++) sigma += a[k][j] * x[j];
        x[k] = (b[k] - sigma) / a[k][k];
    }
    for (int i = 1; i <= n; i++) printf("%lf\t", x[i]);
    return 0;
}*/

运行结果

在这里插入图片描述

在这里插入图片描述

牛顿(Newton)迭代法,原文链接:

https://blog.csdn.net/KissMoon_/article/details/116277622

拉格朗日(Lagrange)插值,原文链接:

https://blog.csdn.net/KissMoon_/article/details/116278449

四阶龙格-库塔(Runge-Kutta)方法,原文链接:

https://blog.csdn.net/KissMoon_/article/details/116278567

Newton/Gauss/Lagrange/Runge-Kutta实验内容+方法指导+Matlab脚本+Matlab函数+Matlab运行报告+C程序+实验报告,一键下载:

https://download.csdn.net/download/KissMoon_/18244419

凉梦空间

欢迎你进入我的个人博客网站参观交流:https://www.liangmeng.xyz

在这里插入图片描述

#include #include #define N 100 #define epsilon 1e-6 float a[N][N+1]; void menu( ) { printf("\t\t%c%c%c^_^Gauss列主元消去法求解线性方程组^_^%c%c%c\n\n",1,1,1,1,1,1); printf("强烈建议您先阅读以下几点后在运行:\n"); printf("1.这是用Gauus列主元消去法求解线性方程组的应用程序\n"); printf(" (Gauus全主元消去法类似可做,读者有兴趣的话可自行而做)\n"); printf("2.请您先了解Gauus列主元消去法的主要思想\n"); } void main( ) { int i,j,k,n; float t,s=0; char choice; menu( ); loop: printf("\n请输入系数方阵的阶数:"); scanf("%d",&n); while(n>0) { printf("\n"); printf("请输入增广阵矩:\n"); for(i=0;i<n;i++) for(j=0;j<n+1;j++) scanf("%f",&a[i][j]);/*存储增广阵矩*/ for(k=0;k<n-1;k++) { for(i=k+1;i fabs(a[k][k]) ) for(j=k;j<n+1;j++) { t=a[k][j]; a[k][j]=a[i][j]; a[i][j]=t; } if( fabs(a[k][k]) < epsilon)/*最大数小于很小数时退出*/ { printf("\n错误,Gauss列主元消去法无法忍受,在%d步退出!\n",k+1); printf("还要再计算其他的么(Y/N)?"); scanf("%c",&choice); if(choice=='Y' || choice=='y')/*判断用户输入*/ goto loop; else return; } for(i=k+1;i<n;i++) { a[i][k]=a[i][k] / a[k][k]; for(j=k+1;j=0;k--) { s=0; for(j=k+1;j<n;j++) s+=a[k][j]*a[j][n]; a[k][n]=( a[k][n]-s ) / a[k][k]; } printf("\n*****运行结果*****\n"); for(i=0;i<n;i++) printf(" x[%d]=%.4f\n",i+1,a[i][n]); printf(" 谢谢使用!\n"); printf("还要再计算其他的么(Y/N)?"); getchar( ); scanf("%c",&choice); if(choice=='Y' || choice=='y')/*判断用户输入*/ goto loop; else return; } }
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

凉丶梦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值