from scipy.optimize import fsolve
from scipy.optimize import root
# print(help(root))
## fsolve
第一个参数函数表达式 ,第二个参数,解的预测估计,第三个参数,函数中的参数a, b
def fun(i):
x = i[0]
y = i[1]
return [x ** 2 + y ** 2 - 1, x - y]
s1 = fsolve(fun, [1, 1])
print(s1)
## 求一重积分
from scipy.integrate import quad
def fun(x, a, b):
return a*x**2 + b*x
# 0, 1 是区间, args 是fun函数的参数
result = quad(fun, 0, 1,args=(2, 1))
print(result)'''
## 求解非线性 方程组最小二乘解
'''fun:callable
具有签名的计算残差矢量的函数fun(x, *args, **kwargs),即最小化会针对第一个参数进行。争论x传递给此函数的是形状为(n,)的ndarray(即使n = 1,也不要标量)。它必须返回形状(m,)或标量的1-d 数组。如果论点x是复杂的还是函数fun返回复杂的残差,必须将其包装在实参的实函数中,如示例部分结尾所示。
x0:array_like with shape (n,) 或 float
对自变量的初步猜测。如果为float,则将其视为具有一个元素的一维数组。
jac:{‘2-point’, ‘3-point’, ‘cs’, callable}, 可选参数
计算雅可比矩阵的方法(m-by-n矩阵,其中元素(i,j)是f [i]相对于x [j]的偏导数)。关键字选择用于数字估计的有限差分方案。方案“ 3点”更准确,但所需的操作量是“ 2点”(默认值)的两倍。方案‘cs’使用复杂的步骤,虽然可能是最精确的步骤,但仅在fun正确地处理了复杂的输入并且可以解析地继续到复杂的平面时才适用。方法‘lm’始终使用“两点”方案。如果可调用,则用作jac(x, *args, **kwargs)并应以数组(应用np.atleast_2d),稀疏矩阵或a的形式返回雅可比行列式的良好近似值(或精确值)。scipy.sparse.linalg.LinearOperator。
bounds:2-tuple of array_like, 可选参数
自变量的上下限。默认为*。每个数组必须匹配x0的大小或为标量,在后一种情况下,所有变量的界限都相同。使用np.inf带有适当的符号以禁用所有或某些变量的界限。
'''
method:{‘trf’, ‘dogbox’, ‘lm’}, 可选参数
from scipy.optimize import least_squares
import numpy as np
a = np.loadtxt('data2_47.txt')
x0 = a[0]
y0 = a[1]
d = a[2]
'''
def fun(x, x0, y0, d):
return np.sqrt((x0 - x[0])**2 +(y0 - x[1])**2) - d
result = least_squares(fun, [0,0], args=(x0, y0, d))
print(result, '\n', result.x)
## 求矩阵最大特征值对应的特征向量
'''scipy.linalg.eig(a, b=None, left=False, right=True, overwrite_a=False, overwrite_b=False, check_finite=True, homogeneous_eigvals=False)
解决方矩阵的普通或广义特征值问题。
求出一般矩阵的特征值w和左右特征向量:
a vr[:,i] = w[i] b vr[:,i]
a.H vl[:,i] = w[i].conj() b.H vl[:,i]
其中.H是埃尔米特变迁。
参数:
a:(M, M) array_like
将计算其特征值和特征向量的复数或实数矩阵。
b:(M, M) array_like, 可选参数
广义特征值问题中的Right-hand边矩阵。默认值为无,假定为单位矩阵。
left:bool, 可选参数
是否计算并返回左特征向量。默认值为False。
左特征向量,即是乘在矩阵的左边的向量(横向量)。求法先求转置矩阵的特征值和对应的特征向量(列向量)。将求的向量写成横向量即为左特征向量,转置矩阵的特征值为矩阵的做特征值。具体解法见插图。
right:bool, 可选参数
是否计算和返回右特征向量。默认值为True。
overwrite_a:bool, 可选参数
是否覆盖一个;可能会提高性能。默认值为False。
overwrite_b:bool, 可选参数
是否覆盖b;可能会提高性能。默认值为False。
check_finite:bool, 可选参数
是否检查输入矩阵仅包含有限数。禁用可能会提高性能,但是如果输入中确实包含无穷大或NaN,则会导致问题(崩溃,终止)。
homogeneous_eigvals:bool, 可选参数
如果为True,则以齐次坐标返回特征值。在这种情况下w是一个(2,M)数组,因此:
w[1,i] a vr[:,i] = w[0,i] b vr[:,i]
默认值为False。
返回值:
w:(M,)或(2,M)双重或复数ndarray
特征值,每个特征值根据其多重性重复。形状为(M,),除非homogeneous_eigvals=True。
vl:(M,M)双重或复数ndarray
对应于特征值的归一化左特征向量w[i]是列vl [:,i]。仅在以下情况下返回left=True。
vr:(M,M)双重或复数ndarray
对应于特征值的归一化右特征向量w[i]是专栏vr[:,i]。仅在以下情况下返回right=True。
异常:
LinAlgError
如果特征值计算不收敛。
'''
from scipy.sparse.linalg import eigs
import numpy as np
a = np.array([[1, 23, 4], [3, 4, 5], [5, 4, 5]], dtype=float)
b, c = np.linalg.eig(a)
d, e = eigs(a, 1) # 输出最大的特征值和特征向量, 不加1则返回所有的
print("所有特征值:", b)
print("所有特征向量:", c)
print("最大模特征值为:", d)
print("对应的特征向量:", e)