114.求解线性方程

简介: 114.求解线性方程
#include "stdlib.h"
#include "math.h"
#include "stdio.h"
#define MAX 255
int Guass(a,b,n)
int n;
double a[],b[];
{
  int *js,l,k,i,j,is,p,q;
  double d,t;
  js=malloc(n*sizeof(int));
  l=1;
  for (k=0;k<=n-2;k++)
  {
    d=0.0;
    /*下面是换主元部分,即从系数矩阵A的第K行,第K列之下的部分选出
    绝对值最大的元,交换到对角线上。*/
    for (i=k;i<=n-1;i++)
      for (j=k;j<=n-1;j++)
      {
        t=fabs(a[i*n+j]); /*fabs()定义在math.h中,含义是求一个浮点数的绝对值。*/
        if (t>d) { d=t; js[k]=j; is=i;}
      }
    if (d+1.0==1.0) l=0;  /*主元为0*/
    /*主元不为0的时候*/
    else
    {
      if (js[k]!=k)
        for (i=0;i<=n-1;i++)
        {
          p=i*n+k; q=i*n+js[k];
          t=a[p]; a[p]=a[q]; a[q]=t;
        }
      if (is!=k)
      {
        for (j=k;j<=n-1;j++)
        {
          p=k*n+j; q=is*n+j;
          t=a[p]; a[p]=a[q]; a[q]=t;
        }
        t=b[k]; b[k]=b[is]; b[is]=t;
      }
    }
    if (l==0)
    {
      free(js); printf("fail\n");
      return(0);
    }
    d=a[k*n+k];
    /*下面为归一化部分*/
    for (j=k+1;j<=n-1;j++)
    {
      p=k*n+j; a[p]=a[p]/d;
    }
    b[k]=b[k]/d;
    /*下面为矩阵A,B消元部分*/
    for (i=k+1;i<=n-1;i++)
    {
      for (j=k+1;j<=n-1;j++)
      {
        p=i*n+j;
        a[p]=a[p]-a[i*n+k]*a[k*n+j];
      }
      b[i]=b[i]-a[i*n+k]*b[k];
    }
  }
  d=a[(n-1)*n+n-1];
  /*矩阵无解或有无限多解*/
  if (fabs(d)+1.0==1.0)
  {
    free(js); printf("该矩阵为奇异矩阵\n");
    return(0);
  }
  b[n-1]=b[n-1]/d;
  /*下面为迭代消元*/
  for (i=n-2;i>=0;i--)
  {
    t=0.0;
    for (j=i+1;j<=n-1;j++)
      t=t+a[i*n+j]*b[j];
    b[i]=b[i]-t;
  }
  js[n-1]=n-1;
  for (k=n-1;k>=0;k--)
    if (js[k]!=k)
    { t=b[k]; b[k]=b[js[k]]; b[js[k]]=t;}
  free(js);
  return(1);
}
main()
{
  int i,n;
  double A[MAX];
  double B[MAX];
  clrscr();
  puts("This is a program to solve N order linear equation set Ax=B.");
  puts("\n It use Guass Elimination Method to solve the equation set:");
  puts("\n    a(0,0)x0+a(0,1)x1+a(0,2)x2+...+a(0,n-1)xn-1=b0");
  puts("    a(1,0)x0+a(1,1)x1+a(1,2)x2+...+a(1,n-1)xn-1=b1");
  puts("    ......");
  puts("    a(n-1,0)x0+a(n-1,1)x1+a(n-1,2)x2+...+a(n-1,-1)xn-1=bn-1\n");
  printf(" >> Please input the order n (>1): ");
  scanf("%d",&n);
  printf(" >> Please input the %d elements of matrix A(%d*%d) one by one:\n",n*n,n,n);
  for(i=0;i<n*n;i++)
    scanf("%lf",&A[i]);
  printf(" >> Please input the %d elements of matrix B(%d*1) one by one:\n",n,n);
  for(i=0;i<n;i++)
    scanf("%lf",&B[i]);
  if (Guass(A,B,n)!=0) /*调用Guass消去,1为计算成功*/
  printf(" >> The solution of Ax=B is x(%d*1):\n",n);
  for (i=0;i<n;i++) /*打印结果*/
    printf("x(%d)=%f  ",i,B[i]);
  puts("\n Press any key to quit...");
  getch();
}
相关文章
解决删除文件时出现“该项目不在XX中,请确认该项目的位置然后重试”的提示
近期在删除文件夹的时候,出现了这个“该项目不在XX中,请确认该项目的位置然后重试”的提示,实际上这个文件(夹)就在那里,死活都删不掉,win10系统重启之后删除都不行的
10478 0
|
7月前
|
SQL 关系型数据库 分布式数据库
PolarDB 开源基础教程系列 7.5 应用实践之 TPCH性能优化
PolarDB在复杂查询、大数据量计算与分析场景的测试和优化实践.
218 7
|
8月前
|
SQL 缓存 关系型数据库
如何解决MySQL 的深度分页问题?
在构建高性能Web应用程序时,数据库查询性能至关重要。本文深入探讨了MySQL中`LIMIT ... OFFSET ...`语法的性能瓶颈,并介绍了一种更高效的分页方法——游标分页(Cursor Pagination)。通过记录每页最后一个记录的唯一标识,游标分页能显著提升查询效率,将时间复杂度从O(n + m)降低到O(log n + m),特别适用于大规模数据的分页查询场景。此外,文章还介绍了其他优化方法,如覆盖索引分页、分区表、缓存和基于时间戳的分页,并提供了实践中的最佳建议,帮助开发者选择最适合的分页策略,提升系统性能和用户体验。
487 9
|
9月前
|
JSON 人工智能 算法
探索大型语言模型LLM推理全阶段的JSON格式输出限制方法
本篇文章详细讨论了如何确保大型语言模型(LLMs)输出结构化的JSON格式,这对于提高数据处理的自动化程度和系统的互操作性至关重要。
1132 48
|
7月前
|
运维 监控 调度
普通人如何用PCDN来赚钱
私有内容分发网络(PCDN)利用分散的终端设备和带宽资源,构建去中心化的内容分发系统。普通人可通过搭建PCDN,利用闲置设备实现低成本、高灵活性的赚钱机会。主要步骤包括硬件准备、选择稳定软件平台、设计网络架构、内容管理和运维监控。盈利模式涵盖提供PCDN服务、广告合作、流量变现及增值服务。通过优化网络配置和设备选择,可最大化收益。尽管存在法律风险和收益波动,但合理搭建和维护能带来可观回报。
12671 0
|
存储
计算机组成原理(8)----专用数据通路
计算机组成原理(8)----专用数据通路
547 1
|
10月前
二进制数从0开始的前几个数
二进制数从0开始的前几个数:
1293 0
|
12月前
|
存储 NoSQL Java
aspect实现mock-feign接口
该代码为一个用于Feign接口的模拟(Mock)实现类`FeignMockAspect`,通过切面编程方式对带有`@FeignClient`注解的接口提供模拟响应。在非生产环境中,根据特定配置从Redis中获取Mock数据并转换为对应类型的对象返回,以减少对外部系统的依赖和提高测试效率。使用Hutool工具类和Spring Data Redis进行数据处理与存储操作。
|
Dubbo Cloud Native 应用服务中间件
调研 7 个开源项目后,这家数据合规平台如何构建高性能网关
调研 7 个开源项目后,这家数据合规平台如何构建高性能网关
412 79
|
前端开发 Java Spring
Spring MVC中使用ModelAndView传递数据
Spring MVC中使用ModelAndView传递数据