【问题标题】:Solve equation using fsolve with inequality equations使用 fsolve 和不等式求解方程
【发布时间】:2021-04-10 11:48:03
【问题描述】:

我无法理解如何将不等式添加到 fsolve 函数。

例如:

这是包裹:

import numpy as np
from scipy.optimize import fsolve

这些是我想使用的方程式:

x1 >= 0.4 and x1 <= 0.7
x2 >= 0.2 and x2 <= 0.4
5x2**2 + 2x1**3 = 2 

这是我要创建的功能:

myFunc(z):
    x1 = z[0]
    x2 = z[1]
    
    F = np.empty((3))
    F[0] = x1 >= 0.4 and x1 <= 0.7 # <-- This is the first equation
    F[1] = x2 >= 0.2 and x2 <= 0.4 # <-- this is the second equation
    F[2] = 5x2**2 + 2x1**3 = 2 # <-- this is the third equation
    return F

然后我们调用 fsolve:

zGuess = np.array([0.3,0.3])
z = fsolve(myFunction,zGuess)
print(z)

关于如何设置不等式的任何想法?

【问题讨论】:

  • 你确定变量的界限是正确的吗?没有满足第三个等式的点,请参阅0.4**3 + 0.2**2 = 0.041 &lt; 0.7
  • 你是对的。我修好了
  • 如果我的回答对你有帮助,如果你能接受就太好了。

标签: python numpy scipy


【解决方案1】:

fsolve 方法既不能处理不等式约束,也不能处理变量的界限。您的前两个约束是简单的框约束,即变量的界限,因此您只想求解非线性方程组2x1**3 + 5x**2 == 2 受限于变量界限。这可以表述为一个约束最小化问题,类似于this answer

For F(x) = 2x1**3 + 5x**2 - 2 you want to solve

min ||F(x)|| 

s.t. 0.4 <= x1 <= 0.7, 
     0.2 <= x2 <= 0.4

这个有约束的优化问题可以通过scipy.optimize.minimize 轻松解决,如下所示:

from scipy.optimize import minimize
import numpy as np

def obj(x): return 5*x[1]**2 + 2*x[0]**3 - 2

# Set the variable bounds
bounds = [(0.4, 0.7), (0.2, 0.4)]

# Set initial guess
x0 = np.array([0.3, 0.3])

# Solve the problem (res.x contains your solution)
res = minimize(lambda x: np.linalg.norm(obj(x)), x0=x0, bounds=bounds)

请注意,您的界限内没有任何点满足非线性方程。不管怎样,当我们最小化残差的欧几里德范数时,我们得到了最好的点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    • 2021-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-15
    相关资源
    最近更新 更多