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