求解非线性方程组
Solving nonlinear systems of equations
我收到这个简单代码的错误,问题是错误只出现在我需要的方程之一 (78 * x**0.3 * y**0.8 - 376
) 中。
错误:invalid value encountered in double_scalars ; F[0] = 78 * x**0.3 * y**0.8 - 376
如果我从第一个等式中删除 * y**0.8
,代码运行完美,但显然它对我不起作用。
代码:
import numpy as np
from scipy.optimize import fsolve
def Funcion(z):
x = z[0]
y = z[1]
F = np.empty((2))
F[0] = 78 * x**0.3 * y**0.8 - 376
F[1] = 77 * x**0.5 * y - 770
return F
zGuess = np.array([1,1])
z = fsolve(Funcion,zGuess)
print(z)
如果 y
为负,F[0]
将是复数。 fsolve
不支持复根查找。
你需要求解非线性方程组F(x,y) = 0 subject x,y >= 0,相当于最小化欧氏范数||F(x,y)|| s.t。 x,y >= 0。要解决这个约束优化问题,可以使用 scipy.optimize.minimize
如下:
import numpy as np
from scipy.optimize import minimize
def Funcion(z):
x = z[0]
y = z[1]
F = np.empty((2))
F[0] = 78 * x**0.3 * y**0.8 - 376
F[1] = 77 * x**0.5 * y - 770
return F
# initial point
zGuess = np.array([1.0, 1.0])
# bounds x, y >= 0
bounds = [(0, None), (0, None)]
# Solve the constrained optimization problem
z = minimize(lambda z: np.linalg.norm(Funcion(z)), x0=zGuess, bounds=bounds)
# Print the solution
print(z.x)
我收到这个简单代码的错误,问题是错误只出现在我需要的方程之一 (78 * x**0.3 * y**0.8 - 376
) 中。
错误:invalid value encountered in double_scalars ; F[0] = 78 * x**0.3 * y**0.8 - 376
如果我从第一个等式中删除 * y**0.8
,代码运行完美,但显然它对我不起作用。
代码:
import numpy as np
from scipy.optimize import fsolve
def Funcion(z):
x = z[0]
y = z[1]
F = np.empty((2))
F[0] = 78 * x**0.3 * y**0.8 - 376
F[1] = 77 * x**0.5 * y - 770
return F
zGuess = np.array([1,1])
z = fsolve(Funcion,zGuess)
print(z)
y
为负,F[0]
将是复数。 fsolve
不支持复根查找。
你需要求解非线性方程组F(x,y) = 0 subject x,y >= 0,相当于最小化欧氏范数||F(x,y)|| s.t。 x,y >= 0。要解决这个约束优化问题,可以使用 scipy.optimize.minimize
如下:
import numpy as np
from scipy.optimize import minimize
def Funcion(z):
x = z[0]
y = z[1]
F = np.empty((2))
F[0] = 78 * x**0.3 * y**0.8 - 376
F[1] = 77 * x**0.5 * y - 770
return F
# initial point
zGuess = np.array([1.0, 1.0])
# bounds x, y >= 0
bounds = [(0, None), (0, None)]
# Solve the constrained optimization problem
z = minimize(lambda z: np.linalg.norm(Funcion(z)), x0=zGuess, bounds=bounds)
# Print the solution
print(z.x)