鉴于以下公式,我正在寻找x和y的值(投资组合风险)。代码确实给了我一个结果,但是问题有多种解决方案(即x
和y
的多个组合可以求解方程式)。
我只对最接近x0
的解决方案感兴趣。例如,假设x0 = 0.45,并且存在x = 0.40
和x = 0.35
的解决方案。我希望求解器返回x = 0.40
。实际上,我想要一个可以使x
和x0
之间的差异最小化的解决方案[最小化绝对(x-x0)]。
在此先感谢您的帮助。
from scipy.optimize import fsolve`
def f(x) :`
port_risk = 0.06
sd_EQ = 0.25
sd_FI = 0.07
Cor = -0.1
return ((sd_EQ**2)*(x**2) + (sd_FI**2)*(y**2) + 2*Cor*sd_EQ*sd_FI*x*y)**0.5 - port_risk
x0 = 0.45354
print ("x = ", x)
print ("y = ", y)
print ("f(x) =", f(x))
答案 0 :(得分:0)
这是一个受限的优化问题,您可以使用minimize中的scipy.optimize函数来解决此问题,
import numpy as np
from scipy.optimize import minimize
def f(x):
port_risk = 0.06
sd_EQ = 0.25
sd_FI = 0.07
Cor = -0.1
return ((sd_EQ**2)*(x[0]**2) + (sd_FI**2)*(x[1]**2) + 2*Cor*sd_EQ*sd_FI*x[0]*x[1])**0.5 - port_risk
# Defining the objective function
def obj_fun(x, x0_start):
return np.abs(x[0] - x0_start)
# Defining the constraint: f(x) = 0
cons = ({"type": "eq", "fun": f})
# Solving the constrained optimization problem.
x0_s = 0.45354
res = minimize(obj_fun, args=(x0_s,), x0=[x0_s, 0], constraints=cons)
print(f"x={res.x[0]}")
print(f"y={res.x[1]}")
PS:我重写了函数f以强调它是两个变量的函数。