假设我有两个方程,其中一个未知,我想使用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发布于 2019-04-26 00:52:01
对于过确定的系统(方程的数量大于变量的数量),您需要使用例如最小二乘法。在这种情况下,通常没有传统意义上的解决办法。我们需要定义,我们应该把什么作为系统的解决方案。
让你有一个有一个标量变量的两个方程组:
f(x) =0 g(x) =0
这种系统通常不一致,在传统意义上没有解决办法。
让我们将一些值eps1和eps2添加到系统的右侧:
f(x) =0+ eps1 g(x) =0+ eps2
eps1和eps2是一些价值;
现在,当x的最小值上升时,让我们找到这样的eps1^2 + eps2^2;这将是最小二乘意义上的系统的解决方案。
要获得这样的解决方案,您可以使用正方形函数。
让我们看一看下面的代码,它解决了您的方程组:
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.])https://stackoverflow.com/questions/55832267
复制相似问题