微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用scipy最小化功能

如何解决使用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}},ftolxtol的默认值。正确理解这一部分超出了此答案的范围;请尝试math.stackexchange.com。)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。