Решить для нелинейного уравнения, но минимизировать разницу по сравнению с начальным входом

Я ищу, чтобы найти значения для х и у, учитывая приведенную ниже формулу (риск портфеля). Код даёт мне результат, но у проблемы есть несколько решений (то есть более чем одна комбинация x а также y может решить уравнение).

Меня интересует только решение, наиболее близкое к x0, Например, предположим, что x0 = 0,45, и существуют решения, которые существуют для x = 0.40 а также x = 0.35, Я хочу, чтобы решатель вернулся x = 0.40, По сути, я хочу решение, которое минимизирует разницу между x а также x0 [минимизировать абсолют (х-х0)].

Заранее спасибо за помощь.

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 ответ

Это ограниченная проблема оптимизации, вы можете решить ее с помощью функции минимизации из 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, чтобы подчеркнуть, что это функция двух переменных.

Другие вопросы по тегам