两个变量的函数减少到 1 个变量,但在 Python 中出现最小化问题
function of two variables reduced to 1 variable but issues with minimizing in Python
我有一个多变量函数(下面的代码),取决于 x1
和 x2
,并且我有一个目标输出值用于此函数,名为 target
。我修复 x1
并在外部函数中提供我的 target
:find_x2
。 objective 是最小化内部函数 error
,它只是我的输出目标和结果值 est
之间的平方距离,相对于 x2
.
但是 运行 它:
find_x2(target = .12, x1 = 100)
产生 x2 = 0.99899
,但应该大致为 .80
.
函数似乎是关于 est
而不是 x2
的最小化,但我不明白为什么。任何帮助将不胜感激。
代码:
import numpy as np
from scipy.optimize import minimize_scalar, minimize
def find_x2(x1, target):
def error(x2, x1 = x1, target = target):
k = np.zeros(x1)
V = np.zeros(x1)
for i in range(x1):
try:
k[i-1] = (i/x1)**(-1/x2)
except:
k[x1-1]=1
for i in range(x1):
V[i] = k[i]/sum(k)
est = sum(V**2)
return (target - est)**2
return minimize_scalar(error, bounds = (.001,.999), method = 'bounded')
试试这个版本:
def find_x2(x1, target):
def error(x2, x1 = x1, target = target):
k = np.zeros(x1)
V = np.zeros(x1)
for i in range(x1):
try:
k[i-1] = (x1/i)**(1/x2)
except:
k[x1-1]=1
for i in range(x1):
V[i] = k[i]/sum(k)
est = sum(V**2)
return (target - est)**2
return minimize_scalar(error, bounds = (.001,.999), method = 'bounded')
find_x2(100, 0.12)
打印
fun: 9.668753433849857e-14
message: 'Solution found.'
nfev: 14
status: 0
success: True
x: 0.801701074855243
我有一个多变量函数(下面的代码),取决于 x1
和 x2
,并且我有一个目标输出值用于此函数,名为 target
。我修复 x1
并在外部函数中提供我的 target
:find_x2
。 objective 是最小化内部函数 error
,它只是我的输出目标和结果值 est
之间的平方距离,相对于 x2
.
但是 运行 它:
find_x2(target = .12, x1 = 100)
产生 x2 = 0.99899
,但应该大致为 .80
.
函数似乎是关于 est
而不是 x2
的最小化,但我不明白为什么。任何帮助将不胜感激。
代码:
import numpy as np
from scipy.optimize import minimize_scalar, minimize
def find_x2(x1, target):
def error(x2, x1 = x1, target = target):
k = np.zeros(x1)
V = np.zeros(x1)
for i in range(x1):
try:
k[i-1] = (i/x1)**(-1/x2)
except:
k[x1-1]=1
for i in range(x1):
V[i] = k[i]/sum(k)
est = sum(V**2)
return (target - est)**2
return minimize_scalar(error, bounds = (.001,.999), method = 'bounded')
试试这个版本:
def find_x2(x1, target):
def error(x2, x1 = x1, target = target):
k = np.zeros(x1)
V = np.zeros(x1)
for i in range(x1):
try:
k[i-1] = (x1/i)**(1/x2)
except:
k[x1-1]=1
for i in range(x1):
V[i] = k[i]/sum(k)
est = sum(V**2)
return (target - est)**2
return minimize_scalar(error, bounds = (.001,.999), method = 'bounded')
find_x2(100, 0.12)
打印
fun: 9.668753433849857e-14
message: 'Solution found.'
nfev: 14
status: 0
success: True
x: 0.801701074855243