求解非线性方程,但最小化与初始输入的差异

时间:2018-08-16 11:00:29

标签: python scipy solver

鉴于以下公式,我正在寻找x和y的值(投资组合风险)。代码确实给了我一个结果,但是问题有多种解决方案(即xy的多个组合可以求解方程式)。

我只对最接近x0的解决方案感兴趣。例如,假设x0 = 0.45,并且存在x = 0.40x = 0.35的解决方案。我希望求解器返回x = 0.40。实际上,我想要一个可以使xx0之间的差异最小化的解决方案[最小化绝对(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))

1 个答案:

答案 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以强调它是两个变量的函数。