【工具代码】解多元一次方程

背景

写一些作业的时候总是要解多元一次方程(特别是电路分析),手算很麻烦又容易出错,索性写了一个C++代码用来方便的求解多元一次方程的解。

使用方式

先输入未知数个数n
然后输入n个方程。
输入示例:
比如有3个未知数 x 0 , x 1 , x 2 x_0, x_1, x_2 x0,x1,x2
三个方程为:
x 0 + x 1 + x 2 = 1 x_0+ x_1 + x_2 = 1 x0+x1+x2=1
x 0 − 2 x 2 = 9 x_0 - 2x_2 = 9 x02x2=9
x 1 + 4 x 2 = 10 x_1 + 4x_2 = 10 x1+4x2=10

那么输入就应该是:

3
1 1 1 1
1 0 -2 9
0 1 4 10

输出为:
在这里插入图片描述
用高斯消元写的,所以复杂度是 O ( N 3 ) O(N^3) O(N3)

代码:

#include<bits/stdc++.h>
#define ll long long
using namespace std;
double a[20][20];
const double eps = 1e-9;
void change(int x, int y, int n){//交换行
    for(int j = 0; j <= n; ++j) swap(a[x][j], a[y][j]);
}
int n;
double ans[20];
void guess()
{
    for(int i = 0; i < n; ++i){
        if(a[i][i] < eps && a[i][i] > -eps){//如果这一位为0
            for(int j = i+1; j < n; ++j) {//找到这一位不为0的交换
                if(abs(a[j][i]) > eps) change(i, j, n);
            }
        }
        if(a[i][i] < eps && a[i][i] > -eps){
            cout<<"输入矩阵存在线性相关向量,请检查!"<<endl;
            return;
        }
        for(int j = i+1; j < n; ++j){
            if(a[j][i] < eps && a[j][i] > -eps) continue;//该位为0,不用管
            double t = a[j][i]/a[i][i];
            for(int k = i; k <= n; ++k){
                a[j][k] -= a[i][k]*t;
            }
        }
    }//处理出上三角矩阵
    for(int i = n-1; i >= 0; --i){
        ans[i] = a[i][n];
        for(int j = n-1; j > i; --j){
            ans[i] -= ans[j]*a[i][j];
        }
        ans[i] /= a[i][i];
    }
}
double pl, pr;
int main()
{
	cout<<"请输入未知数个数:";cin>>n;
	for(int i = 0; i < n; ++i) for(int j = 0; j <= n; ++j) cin>>a[i][j];
	guess();
	for(int i = 0; i < n; ++i){
        cout<<"未知数"<<i<<": "<<ans[i]<<endl;
	}
}
/*
4
1.2 -1 0 -0.1 1
-1 2.0005 -0.0005 0 -0.5
0 -0.0005 0.7505 -0.25 0.5
-0.1 0 -0.25 0.6 0
*/

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
本资源涵盖多元方程组、非线性方程和常微分方程的软件组合,介绍如下: 线性方程组的数值法: 线性方程组亦即多元一次方程组。在自然科学与工程技术中,很多问题的决常常归结为线性方程组,如电学中的网络问题,船体数学放样中的建立三次样条函数问题,机械和建筑结构的设计和计算等等。因此,如何利用电子计算机这一强有力的计算工具去求线性方程组,是一个非常重要的问题。线性方程组的法分直接()法{是指在没有舍入误差的假设下,经过有限步运算即可求得方程组的精确的方法。}和迭代()法{是用某种极限过程去逐步逼近线性方程组精确的方法,即是从一个初始向量x0出发,按照一定的迭代格式产生一个向量序列xk,使其收敛到方程组A*x=b的}。该部分就是针对线性方程组求而设计的,内容包括:线性方程组的直接法:Gauss消去法、Gauss列主元消去法、Gauss全主元消去法、列主元消去法应用『列主元求逆矩阵、列主元求行列式、矩阵的三角分』、LU分法、平方根法、改进的平方根法、追赶法(三对角)、列主元三角分法;线性方程组的迭代法:雅可比迭代法、高斯-塞德尔迭代法、逐次超松驰迭代法;迭代法的收敛性『正定矩阵判断、向量范数、矩阵范数、严格对角站优矩阵判断』。 非线性方程的数值法: 在科学研究与工程技术中常会遇到求非线性方程f(x)=0的问题。而方程f(x)是多项式或超越函数又分为代数方程或超越方程。对于不高于四次的代数方程已有求根公式,而高于四次的代数方程则无精确的求根公式,至于超越方程就更无法求其精确了。因此,如何求得满足一定精度要求的方程的近似根也就成为了广大科技工作者迫切需要决的问题。该部分就是针对这一问题而设计的,内容包括:二分法、迭代法、迭代加速法、埃特金加速法、牛顿切线法、弦截法。 常微分方程的数值法: 常微分方程的求问题在实践中经常遇到,但我们只知道一些特殊类型的常微分方程。在科学和工程问题中遇到的常微分方程的往往很复杂,在许多问题中,并不需要方程的表达式,而仅仅需要获得在若干点的就算即可。因此,研究常微分方程的的数值就很有必要。该部分就是针对这些而设计的,内容包括:欧拉(Euler)方法、龙格库塔(Runge-Kutta)方法、线性多步方法

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值