野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 15443|回复: 2

【原创】高斯消元法--基于STM32串口调试(下)

[复制链接]
发表于 2015-12-8 23:07:51 | 显示全部楼层 |阅读模式
本帖最后由 hkhkdyx 于 2015-12-8 23:14 编辑

/* Created by mazirong */
/*2015-12-8 */

gs_elim.c
#include "gs_elim.h"

// k:提取原数组特定位置值,防止运算一次被覆盖
// m:优化前一行矩阵
double k,m;

// i:行
// j:列
// t:消元次数
// 注意:数值是以0开始,所以实际值应该加1
int i,j,t;

// 定义一个N*N列的矩阵A
// |1   2   1   2|
// |3   5   2   1|
// |2   3  -1   1|
// |4  -1   3  -2|
double A[N][N] = { 1,  2,  1,  2,
                               3,  5,  2,  1,
                                   2,  3, -1,  1,
                                   4, -1,  3, -2};

// 定义矩阵的增广部分B
// |16|
// |23|
// |9 |
// |3 |
double B[N] = {16, 23, 9, 3};

// 未知数X数组
double X[N+1] = {0};


// 高斯消元法函数
void Gs_Elim(void)
{
        /********************显示待解的增广矩阵**********************/
        printf("待解的增广矩阵为:\n");
        for(i=0;i<N;i++)
        {   
                // 循环打印第i行系数
                for(j=0;j<N;j++)
                printf("%12lf  ",A[j]);                        // %12lf:输出场宽为12的浮点数,其中小数点占1,数据右对齐。
                // 打印第i行增广数
                printf("|%12lf\r\n",B);               
        }
        printf("\r\n");

        /*******************消元化简*********************/
        do{
                printf("%d次消元结果:\r\n", t+1);

                /**********显示第(1)行至第(t)行(若t=0不执行)*****************/
                for(i=0; i<t; i++)
                {
                        for(j=0; j<N; j++)
                        {
                                printf("%12lf  ", A[j]);
                        }
                        printf("|%12lf\r\n", B);
                }

                /****************显示优化后的第(t+1)************************/
                k = A[t][t];                                                // A[t][t]先提取出来,防止运算一次被数组覆盖
                for(j=0; j<N; j++)
                {
                        A[t][j] = A[t][j] / k;                          // 得到优化后的第(t+1)行矩阵值
                        printf("%12lf  ", A[t][j]);
                }
                B[t] = B[t] / k;                                        // n为第t+1行的增广部分
                printf("|%12lf\r\n", B[t]);                        // 显示第(t+1)行的增广部分

                /****************显示消元后的第(t+2)行至第(N)****************/
                for(i=t+1; i<N; i++)
                {
                        k = A[t];                                        // A[t]先提取出来,防止运算一次被数组覆盖                                
                        for(j=0; j<N; j++)                                // 循环输出消元后的第1N
                        {
                                m = A[t][j] / A[t][t];                // (t+1)行元素同时除以A[t][t]   
                                A[j] = A[j] - k*m;        // 消除运算及覆盖原数组
                                printf("%12lf  ", A[j]);        // 显示第(i+1)行第(j+1)列数组值
                        }
                        B = B - B[t]*k;                        
                        printf("|%12lf\r\n", B);                // 显示第(i+1)行的增广部分
                }

                /**********************************************************/
                t++;
        }while(t<N);
        printf("\r\n");

        /***********************回代求X***********************************/
        //        X[4] = B[N-1];
        //        X[3] = B[N-2] - A[N-2][N-1]*X[4];
        //        X[2] = B[N-3] - A[N-3][N-1]*X[4] - A[N-3][N-2]*X[3];
        //        X[1] = B[N-4] - A[N-4][N-1]*X[4] - A[N-4][N-2]*X[3] - A[N-4][N-3]*X[2];
        for(i=N-1;i>=0;i--)
        {
                X[i+1] = B;
                for(j=0;j<(N-i-1);j++)
                {
                        X[i+1] -= A[N-j-1]*X[4-j];
                }
        }
        printf(" X[1] = %lf  ", X[1]);
        printf(" X[2] = %lf  ", X[2]);
        printf(" X[3] = %lf  ", X[3]);
        printf(" X[4] = %lf  ", X[4]);
}

回复

使用道具 举报

发表于 2015-12-13 11:35:36 | 显示全部楼层
帮顶     
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-12-13 12:52:01 | 显示全部楼层

谢谢火哥
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-5-15 01:11 , Processed in 0.035230 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表