作为个人学习笔记,分享给大家看看!
一,适定方程组求解
1,解线性方程组
example:
2x + 3y = 5
x + 3y = 3
求解代码及结果如下 :
解得 x=2,y=1/3.
import numpy as np
from numpy.linalg import solve
a=np.mat([[2,3],[1,3]])#系数矩阵
b=np.mat([5,3]).T #常数项列矩阵
x=solve(a,b) #方程组的解
print(x)
[[2. ] [0.33333333]]
2,解非线性方程组
example:
x*x + 2y = 5
x + y = 1
求解代码及结果如下:
x=3,y=-2 ;
x=-1,y=2.
from scipy.optimize import fsolve
def func(paramlist):
x,y=paramlist[0],paramlist[1]
return [ x**2+2*y-5,
x+y-1 ]
s=fsolve(func,[0,0])
print(s)
[-1. 2.]
解析:
函数func是我们要求解的非线性方程组,其形式为右端等于零的等式的左端式子。
paramlist是方程组的未知数初始值列表,可以任意选取。
注意:
fsolve方法只能得到局部解,没有得到全部解。
如上,只得到了一组解x=-1和y=2.
如果学到了更好的求解方法会持续更新的!
二 超定方程组求解
1,超定线性方程组求解
example:
2x + 3y = 5
x + 3y = 3
x + y = 2
求解代码如下:
#超定线性方程组求解
import numpy as np
from numpy.linalg import lstsq
a=np.mat([[2,3],[1,3],[1,1]])
b=np.mat([5,3,2]).T
x=lstsq(a,b)
print(x)
(matrix([[1.78571429],
[0.42857143]]), matrix([[0.07142857]]), 2, array([4.94235374, 0.75705981]))
对于超定方程组,我们基于最小二乘法得到近似解(第一个元素):x=1.78571429,y=0.42857143.
第二个元素:残差的总和
第三个元素:系数矩阵a的秩
第四个元素:系数矩阵a的奇异值