齐次线性方程组和非齐次线性方程组

 

  1. 定义

齐次线性方程组:等式右侧常数项全部为0

非齐次线性方程组: 等式右侧常数项不全部为0

2.齐次方程组的求解

将系数矩阵化为行阶梯形矩阵,记全为0的行数量为r=n-R(A)。

则非零行的首非零元所在列对应的就是约束变量, 其余变量即为自由变量。

将后r个自由变量未知数,每次只有一个取值为1 ,其余为0 ,然后每次分别带入方程计算,对应的形成r个解。这些r个解的线性组合即为基础解系。

3.非齐次方程组的求解

https://jingyan.baidu.com/article/2a138328e4d4bb074a134fcc.html

分为两步:1.计算特解。将增广矩阵化为行阶梯形矩阵,将r个未知数全部取值为0,得到一个特解。

                  2.计算对应的齐次方程组的基础解系。

4. 方程组有解的判断条件

   齐次方程组:R(A)=n,只有唯一零解

   R(A)<n,有无穷多个解。基础解系中含有的解数量为r=n-R(A)个

   非齐次方程组:R(A)< R(B) ,无解

   R(A)=R(B) ,有解。具体解的情况同齐次方程组。

程序实现:列主消元法

#include<iostream>
#include<cmath>
using namespace std;

const int n = 3;
//交换2个数的大小
template<class T>
void SWAP(T& a, T& b)
{
    T c;
    c = a;
    a = b;

    b = c;
}

//高斯列主元素消元法
void gaussin_L(double a[n][n], double b[n])
{

    int i, j, k;
    int col, row;
    for (k = 0; k < n - 1; k++)
    {
        double ave = 0;
        //找出消元列中最大的那个元素所在的位置
        for (i = k; i < n ; i++)
            if (fabs(a[i][k]) > ave)
            {
                ave = fabs(a[i][k]);
                cout << "ave " << ave << endl;
                row = i;
                col = k;
            }

        //如果该对角线元素是0,同样不能用高斯消元法来求解
        if (a[row][row] == 0)
        {
            cout << "can't solve" << endl;
            return;
        }
        //将找出的行进行交换
        if (k != row)
		{
            for (i = 0; i < n; i++)
            {

                        SWAP(a[row][i], a[k][i]);
            }
			SWAP(b[k], b[row]);
		}
        //消元过程
        double c[n];
        for (j = k + 1; j < n; j++)
        {
            c[j] = a[j][k] / a[k][k];
            cout << c[j] << endl;
        }
        for (i = k + 1; i < n; i++)
        {
            for (j = 1; j < n; j++)
            {
                a[i][j] = a[i][j] - c[i] * a[k][j];
            }
            b[i] = b[i] - c[i] * b[k];
        }

    }

    double x[n];
    x[n - 1] = b[n - 1] / a[n - 1][n - 1];
    for (i = n - 2; i >= 0; i--)
    {

        double sum = 0;
        for (j = i + 1; j < n; j++)
            sum += a[i][j] * x[j];
        x[i] = (b[i] - sum)/a[i][i];
    }
    //打印输出
    for (i = 0; i < n ; i++)
        cout << " x" << "[" << i << "]=" << x[i] << endl;
}

 

思考:列主消元法仅适用于系数矩阵是方阵,而且必须是满秩?

这个消元的过程不就是最简化行列式的过程吗

 

齐次坐标

就是增加一个维度。笛卡尔坐标系(x,y)对应的齐次坐标为(wx,wy,w)。可以对应无穷多个齐次坐标,其实就是一个投影的过程。

### 如何求解非齐次方程 #### 解析过程 非齐次线性微分方程或代数方程的一般形式为 \( L(x) = f(t) \),其中 \( L(x) \) 是一个线性算子,\( f(t) \neq 0 \) 表示非齐次项。为了找到该类方程的完整解,通常分为两步: 1. **求齐次方程的通解** 考虑对应的齐次方程 \( L(x) = 0 \),通过特征方程或其他方法找出其基础解系并表示为通解的形式。 2. **找非齐次方程的一个特解** 使用适当的方法(如待定系数法、变易常数法等),设法构造出满足原非齐次方程的一个特定解。 最终完整的解由齐次方程的通解加上非齐次方程的特解构成[^3]。 --- #### Python 实现一元二次方程求解 对于简单的一元二次方程 \( ax^2 + bx + c = 0 \),可以通过判别式判断根的情况,并利用公式直接求解。以下是基于 Python 的实现代码[^4]: ```python import math def solve_quadratic(a, b, c): discriminant = b**2 - 4*a*c if discriminant > 0: root1 = (-b + math.sqrt(discriminant)) / (2 * a) root2 = (-b - math.sqrt(discriminant)) / (2 * a) return root1, root2 elif discriminant == 0: root = -b / (2 * a) return root, else: real_part = -b / (2 * a) imaginary_part = math.sqrt(-discriminant) / (2 * a) return complex(real_part, imaginary_part), complex(real_part, -imaginary_part) # 测试例子 print(solve_quadratic(1, -3, 2)) ``` 此程序能够处理实数复数范围内的所有情况。 --- #### Matlab 中高阶多项式求解 当面对更高次数的多项式时,可以直接调用 `roots` 函数来获取所有的根。例如,给定方程 \( x^3 - 6x^2 + 11x - 6 = 0 \)[^1]: ```matlab coefficients = [1, -6, 11, -6]; solutions = roots(coefficients); disp(solutions); ``` 这段脚本会输出三个精确的数值解。 --- #### 高斯消元法解决线性系统 针对形如 \( A\vec{x}=\vec{b} \) 的线性方程组,如果存在唯一解,则可通过高斯消元或者矩阵分解技术快速得出结果;若有无穷多解,则需额外分析自由变量及其关联关系[^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值