Python 使用'fsolve'求解具有n个未知量的m方程,其中n<;M
假设我有两个方程,其中一个未知,我想用Python 使用'fsolve'求解具有n个未知量的m方程,其中n<;M,python,mathematical-optimization,Python,Mathematical Optimization,假设我有两个方程,其中一个未知,我想用fsolve来解它: 0 = 0.5*x[0]**2-2 0 = 2-x 答案显然是x=2。我试过这个 import numpy as np; from scipy.optimize import fsolve def f(x): r = np.zeros(2) r[0] = 0.5*x[0]**2-2 r[1] = 2-x[0] return r fsolve(f,[0.5]) 错误消息是“函数返回的数组在调用之
fsolve
来解它:
0 = 0.5*x[0]**2-2
0 = 2-x
答案显然是x=2
。我试过这个
import numpy as np; from scipy.optimize import fsolve
def f(x):
r = np.zeros(2)
r[0] = 0.5*x[0]**2-2
r[1] = 2-x[0]
return r
fsolve(f,[0.5])
错误消息是“函数返回的数组在调用之间的大小发生了更改”
我看不出这里出了什么问题。我如何解决这个问题
一般来说,当变量的数量小于方程的数量时,如何求解方程
这是完整的信息
Traceback (most recent call last):
File "<ipython-input-37-e4f77791f3f6>", line 12, in <module>
fsolve(f,[0.5])
File "... anaconda3/lib/python3.7/site-packages/scipy/optimize/minpack.py", line 148, in fsolve
res = _root_hybr(func, x0, args, jac=fprime, **options)
File ".... /anaconda3/lib/python3.7/site-packages/scipy/optimize/minpack.py", line 227, in _root_hybr
ml, mu, epsfcn, factor, diag)
ValueError: The array returned by a function changed size between calls
回溯(最近一次呼叫最后一次):
文件“”,第12行,在
fsolve(f[0.5])
文件“…anaconda3/lib/python3.7/site packages/scipy/optimize/minpack.py”,第148行,在fsolve中
res=\u root\u hybr(func,x0,args,jac=fprime,**选项)
文件“…/anaconda3/lib/python3.7/site packages/scipy/optimize/minpack.py”,第227行,在根目录下
ml,mu,epsfcn,因子,diag)
ValueError:函数返回的数组在调用之间更改了大小
对于超定系统(方程式的数量大于变量的数量),您需要使用,例如,最小二乘法。在这种情况下,通常没有传统意义上的解决方案。我们需要定义,我们应该将什么视为系统的解决方案
让您有一个由两个方程和一个标量变量组成的系统:
f(x)=0
g(x)=0
该系统通常不一致,在传统意义上没有解决方案
让我们将一些值eps1和eps2添加到系统的右侧部分:
f(x)=0+eps1
g(x)=0+eps2
eps1和eps2是一些值
现在,让我们找到这样的x
,当eps1^2+eps2^2
增加其最小值时;这将是系统的解决方案
在最小二乘意义上
要使用scipy获得这样的解决方案,可以使用函数
让我们看一下下面的代码,它解决了您的方程组:
import numpy as np
from scipy.optimize import fsolve, least_squares
def f(x):
r = np.zeros(2)
r[0] = 0.5*x**2-2
r[1] = 2-x
return r
least_squares(f, [0.0])
结果:
active_mask: array([0.])
cost: 5.175333019854869e-20
fun: array([ 2.87759150e-10, -1.43879575e-10])
grad: array([7.19397879e-10])
jac: array([[ 2.00000001],
[-1. ]])
message: '`gtol` termination condition is satisfied.'
nfev: 6
njev: 6
optimality: 7.193978788924559e-10
status: 1
success: True
x: array([2.])