如何解决使用scipy最小化功能
我正在尝试完成一项任务,但我只是想不通。
这是我的功能:
1/(x**1/n) + 1/(y**1/n) + 1/(z**1/n) - 1
我希望该总和尽可能接近1。
这些是我的输入变量(x,y,z):
test = np.array([1.42,5.29,7.75])
所以 n 是唯一的决策变量。
总结:
我现在有这样的情况:
1/(1.42**1/1) + 1/(5.29**1/1) + 1/(7.75**1/1) = 1.02229
我想获得以下信息:
1/(1.42^(1/0.972782944446024)) + 1/(5.29^(1/0.972782944446024)) + 1/(7.75^(1/0.972782944446024)) = 0.999625
到目前为止,我几乎一无所有,欢迎任何帮助。
import numpy as np
from scipy.optimize import minimize
def objectiv(xyz):
x = xyz[0]
y = xyz[1]
z = xyz[2]
n = 1
return 1/(x**(1/n)) + 1/(y**(1/n)) + 1/(z**(1/n))
test = np.array([1.42,7.75])
print(objectiv(test))
OUTPUT: 1.0222935270013889
如何正确定义约束?
def conconstraint(xyz):
x = xyz[0]
y = xyz[1]
z = xyz[2]
n = 1
return 1/(x**(1/n)) + 1/(y**(1/n)) + 1/(z**(1/n)) - 1
我完全不知道如何处理 n ?
编辑
我设法执行以下操作:
def objective(n,*args):
x = odds[0]
y = odds[1]
z = odds[2]
return abs((1/(x**(1/n)) + 1/(y**(1/n)) + 1/(z**(1/n))) - 1)
odds = [1.42,7.75]
solve = minimize(objective,1.0,args=(odds))
我的输出:
fun: -0.9999999931706812
x: array([0.01864994])
实际上,当输入公式时:
(1/(1.42^(1/0.01864994)) + 1/(5.29^(1/0.01864994)) + 1/(7.75^(1/0.01864994))) -1 = -0.999999993171
不幸的是,我需要一个正数1,我不知道该更改什么。
解决方法
我们想找到n
,它得到的固定 x,y和z尽可能接近1
的结果。 minimize
试图获得某物的最低可能值,没有负界限; -3
比-2
更好,依此类推。
因此,我们真正想要的是称为least-squares优化。但是,类似的想法。该文档有点难以理解,因此我将尝试阐明:
所有这些优化功能都有一个通用的设计,您可以传入一个至少包含一个参数的可调用对象,该参数为您要优化的参数(在您的情况下为n
)。然后,您可以让它接受更多参数,这些参数的值将根据您传递的内容进行固定。
在您的情况下,您希望能够解决x,y和z的不同值的优化问题。因此,您可以让回调函数接受n,x,y和z,并传递x,y和z值以在调用scipy.optimize.least_squares
时使用。您可以使用args
关键字参数传递这些参数(注意,它不是* args)。我们还可以为1
值提供n
的初始猜测,算法会对其进行完善。
其余就是与我们的目的无关的定制。
因此,首先让我们进行回调:
def objective(n,x,y,z):
return 1/(x**(1/n)) + 1/(y**(1/n)) + 1/(z**(1/n))
现在我们的通话看起来像:
best_n = least_squares(objective,1.0,args=np.array([1.42,5.29,7.75]))
(您可以以相同的方式调用minimize
,它将查找n
值以使objective
函数返回尽可能低的值。如果我在想显然:n
的猜测应该趋于零,从而使分母无限制地增加,使得倒数的总和趋近于零;不可能出现负值;但是,当其接近零时它将停止,根据{{1}},ftol
和xtol
的默认值。正确理解这一部分超出了此答案的范围;请尝试math.stackexchange.com。)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。