使用 scipy 最小化函数

Minimize function with 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, 5.29, 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,5.29,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 的结果尽可能接近 1minimize 尝试获得某物的最低可能值,没有负边界; -3优于-2,依此类推

所以我们真正想要的是所谓的least-squares优化。不过,类似的想法。这个文档有点难懂,所以我会尽量澄清:

所有这些优化函数都有一个共同的设计,您传入一个至少带有一个参数的可调用对象,您要优化的参数(在您的情况下,n).然后你可以让它接受更多的参数,这些参数的值将根据你传入的内容固定

在您的情况下,您希望能够针对不同的 x、y 和 z 值解决优化问题。因此,您让回调接受 n、x、y 和 z,并传递 x、y 和 z 值以在调用 scipy.optimize.least_squares 时使用。您使用 args 关键字参数传递它们(注意它不是 *args)。我们还可以为 n 值提供 1 的初始猜测,算法将对其进行优化。

其余的是与我们的目的无关的定制。

所以,首先让我们进行回调:

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 函数 return 的值与可能。如果我想清楚:n的猜测应该趋向于零,使分母无限制地增加,使倒数之和趋于零;负值是不可能的。但是,当它停止时根据 ftolxtolgtol 的默认值,它接近于零。正确理解这部分超出了本答案的范围;请尝试 math.stackexchange.com.)