爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 2345|回复: 0

C语言实现矛盾方程求解

[复制链接]

新浪微博达人勋

发表于 2022-3-19 14:53:05 | 显示全部楼层 |阅读模式

登录后查看更多精彩内容~

您需要 登录 才可以下载或查看,没有帐号?立即注册 新浪微博登陆

x
本帖最后由 魏墨 于 2022-3-19 14:58 编辑

​

                               
登录/注册后可看大图

                               
登录/注册后可看大图
​
矛盾方程组,非常好理解,其实为翻译上述图片,当你图片看懂了,原理就懂了:
代码实现:
#include<stdio.h> # define M 100
#include<stdio.h>
# define M 100
int main()
{
        int i,j,n,w1,w2,k1,k2,t,r,k,w,e,o1,o2,e1;double x[M],y[M],a[M][M],b[M][M],c[M],d[M],h[M][M],max,f,s;
    //录入数据
        printf("输入未知数的个数n:");
        scanf("%d",&n);
        printf("输入方程行数K1:");
        scanf("%d",&k1);
        printf("输入方呈列数K2:");//不包括y值那一列
        scanf("%d",&k2);
        printf("输入增广矩阵数据:");
        for(i=0;i<k1;i++)
        {
                for(j=0;j<k2;j++)
                {
                        scanf("%lf",&a[j]);
                        b[j]=a[j];//b矩阵为a矩阵的转置       
                }
                scanf("%lf",&y);
        }
        //处理数据
        //赋初值为0
        for(i=0;i<k2*k2;i++)
        {
                c=0;
                d=0;
        }
        w1=0;
        for(i=0;i<k2;i++)
        {   
                for(j=0;j<k2;j++)
                {  for(e1=0;e1<4;e1++)
                        {
                        c[w1]=c[w1]+a[e1][j]*b[e1];       
                        }       
                        w1=w1+1;
                }
   }
                for(i=0;i<3;i++)
                {
                for(e1=0;e1<4;e1++)
                {
                        d=d+b[e1]*y[e1];
                }
                }
        t=0;
        for(i=0;i<k2;i++)
        {
                for(j=0;j<k2;j++)
                {
                        h[j]=c[t++];
                }
        }
                for(i=0;i<k2;i++)
           {
                for(j=0;j<k2;j++)
                {
                printf("%lf  ",h[j]);
            }
            printf("%lf",d);
            printf("\n");
                }
        //用列主元高斯消元法求解
         for(r=0;r<k2-1;r++)
        {        k=r;
        max=h[r][r];
        for(w=r;w<k2-1;w++)
        {
                if(h[w+1][r]>=h[w][r])
                {
                        max=h[w+1][r];
                        k=w+1;
                }
        }
        if(k>=r)
        {       
        for(e=r;e<k2;e++)
        {
                f=h[r][e];
                h[r][e]=h[k][e];
                h[k][e]=f;
        }
                f=d[r];
                d[r]=d[k];
                d[k]=f;       
    }   
        for(i=r+1;i<k2;i++)
    {   f=1.0*h[r]/h[r][r];
                d=d-1.0*f*d[r];
            for(j=r;j<k2;j++)
            {
                    h[j]=h[j]-1.0*f*h[r][j];
                }
        }}
        //回代
        x[k2-1]=1.0*d[k2-1]/h[k2-1][k2-1];
    for(i=k2-2;i>=0;i--)
    {   f=0;
            for(j=i+1;j<k2;j++)
            {
                    s=1.0*h[j]*x[j];
                    f=f+s;
                }
                x=1.0*(d-f)/h;       
        }
        for(i=1;i<k2+1;i++)
        {
        printf("x[%d]=%lf\n",i,x[i-1]);
        }
        return 0;
}

本后面采用列主元高斯消元法进行矩阵求解,代码不难,但是如何利用代码分析矛盾方程组,值得思考。
&#8203;

密码修改失败请联系微信:mofangbao
您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

Copyright ©2011-2014 bbs.06climate.com All Rights Reserved.  Powered by Discuz! (京ICP-10201084)

本站信息均由会员发表,不代表气象家园立场,禁止在本站发表与国家法律相抵触言论

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