Scipy - 具有线性约束的非线性方程组(初学者)
Scipy - Non-linear Equations System with linear constraints (beginner)
我看过这个amazing example。
但是我需要解决在 X 和 F 上有边界的系统,例如:
f1 = x+y^2 = 0
f2 = e^x+ xy = 0
-5.5< x <0.18
2.1< y < 10.6
# 0.15< f1 <20.5 - not useful for this example
# -10.5< f2 < -0.16 - not useful for this example
如何将此边界约束设置为 scipy 的 fsolve()?或者可能还有其他方法?
你能给我一个简单的代码示例吗?
这取决于系统,但您可以在此处简单地检查约束。
首先求解非线性系统以获得 one/none/several 形式 (x,y) 的解。然后检查这些解决方案中哪些(如果有)满足约束条件。
我希望这对您有所帮助。都是 there.
import numpy as np
from scipy.optimize import minimize
def my_fun(z):
x = z[0]
y = z[1]
f = np.zeros(2)
f[0] = x + y ** 2
f[1] = np.exp(x) + x * y
return np.dot(f,f)
def my_cons(z):
x = z[0]
y = z[1]
f = np.zeros(4)
f[0] = x + 5.5
f[1] = 0.18 - x
f[2] = y - 2.1
f[3] = 10.6 - y
return f
cons = {'type' : 'ineq', 'fun': my_cons}
res = minimize(my_fun, (2, 0), method='SLSQP',\
constraints=cons)
res
status: 0
success: True
njev: 7
nfev: 29
fun: 14.514193585986144
x: array([-0.86901099, 2.1 ])
message: 'Optimization terminated successfully.'
jac: array([ -2.47001648e-04, 3.21871972e+01, 0.00000000e+00])
nit: 7
编辑:作为对评论的回应:如果您的函数值 f1
和 f2
不为零,您只需重写方程式,例如:
f1 = -6 和 f2 = 3
您要最小化的函数将是:
def my_fun(z):
x = z[0]
y = z[1]
f = np.zeros(2)
f[0] = x + y ** 2 + 6
f[1] = np.exp(x) + x * y -3
return np.dot(f,f)
我看过这个amazing example。 但是我需要解决在 X 和 F 上有边界的系统,例如:
f1 = x+y^2 = 0
f2 = e^x+ xy = 0
-5.5< x <0.18
2.1< y < 10.6
# 0.15< f1 <20.5 - not useful for this example
# -10.5< f2 < -0.16 - not useful for this example
如何将此边界约束设置为 scipy 的 fsolve()?或者可能还有其他方法? 你能给我一个简单的代码示例吗?
这取决于系统,但您可以在此处简单地检查约束。
首先求解非线性系统以获得 one/none/several 形式 (x,y) 的解。然后检查这些解决方案中哪些(如果有)满足约束条件。
我希望这对您有所帮助。都是 there.
import numpy as np
from scipy.optimize import minimize
def my_fun(z):
x = z[0]
y = z[1]
f = np.zeros(2)
f[0] = x + y ** 2
f[1] = np.exp(x) + x * y
return np.dot(f,f)
def my_cons(z):
x = z[0]
y = z[1]
f = np.zeros(4)
f[0] = x + 5.5
f[1] = 0.18 - x
f[2] = y - 2.1
f[3] = 10.6 - y
return f
cons = {'type' : 'ineq', 'fun': my_cons}
res = minimize(my_fun, (2, 0), method='SLSQP',\
constraints=cons)
res
status: 0
success: True
njev: 7
nfev: 29
fun: 14.514193585986144
x: array([-0.86901099, 2.1 ])
message: 'Optimization terminated successfully.'
jac: array([ -2.47001648e-04, 3.21871972e+01, 0.00000000e+00])
nit: 7
编辑:作为对评论的回应:如果您的函数值 f1
和 f2
不为零,您只需重写方程式,例如:
f1 = -6 和 f2 = 3
您要最小化的函数将是:
def my_fun(z):
x = z[0]
y = z[1]
f = np.zeros(2)
f[0] = x + y ** 2 + 6
f[1] = np.exp(x) + x * y -3
return np.dot(f,f)