使用 SciPy 的多变量函数局部最小值

时间:2021-04-09 18:46:58

标签: python-3.x mathematical-optimization

考虑功能:

MainPage

我想知道,是否可以使用 SciPy.optimize.minimize

在说 [0,1](单位间隔)上找到最小值(对于 x 和 y)?

这是我的尝试:

def f(x,y):
    return x + 3*exp(y**2)

因此,

bound = (0,1)
bds = [bound,bound]
x_0 = [0,0] (initial guess)

但这不起作用。

我不断得到:

“换行符后出现意外字符” At \ bounds = bnds

请注意,我希望 x 和 y 在 [0,1] 上的实数上有所不同

编辑:

scipy.optimize.minimize(f,x_0,method='SLSQP', \ bounds = bds)

这个最小化函数是否只查看整数值 0 和 1?还是查看 [0,1](单位间隔?)中的所有实数。如果是第一个,我不知道如何进入第二个,我该怎么做?

2 个答案:

答案 0 :(得分:2)

您的原始代码不起作用,因为

<块引用>

""行继续符后出现意外字符" At \ bounds = bnds":

告诉您“行继续符”(反斜杠)导致了问题。在那个角色之后你不能有任何东西。在反斜杠后插入换行符,或完全删除反斜杠

一旦你解决了这个问题,你会得到一个错误提示

const blockBlobClient = containerClient.getBlockBlobClient(blobName);
await blockBlobClient.upload(data, data.length, { blobHTTPHeaders: { blobContentType: contentType }});
let blobUrl = `https://${process.env.STORAGE_ACCOUNT}.blob.core.windows.net/${container}/${blobName}`;

const sasOptions = {
    containerName: containerClient.containerName,
    blobName: blobName,
    expiresOn: new Date(new Date().valueOf() + 86400),
    permissions: BlobSASPermissions.parse('r'),
    protocol: SASProtocol.https
};

const sharedKeyCredential = new StorageSharedKeyCredential(process.env.STORAGE_ACCOUNT, process.env.STORAGE_ACCOUNT_KEY);

const sasToken = generateBlobSASQueryParameters(sasOptions, sharedKeyCredential).toString();

blobUrl += `?${sasToken}`;

这是因为 TypeError: f() missing 1 required positional argument: 'y' 想要一个接受 one 输入的函数(请阅读 documentation 的“参数:有趣的部分”)。该输入可以是一个形状数组minimize。当你想要一个多变量最小化时,所有的 n 个变量都进入你函数的单个参数


回复:“这个最小化函数是只查看整数值 0 和 1?还是查看 [0,1](单位间隔?)中的所有实数?如果是第一个,我不是确定如何进入第二个。”

如果它只检查边界值,那将是一个非常无用的优化器,你不觉得吗?

不过,这很容易检查!您当前的函数在 (n, ) 处具有最小值,因此这不是测试函数功能的好方法。让我们定义一个具有不同数字的最小值的函数。例如,让我们定义一个函数,其最小值为 [0, 0]

[0.5, 0.5]

运行你的代码给出结果:

def f(X):
    return abs(X[0] - 0.5) * abs(X[1] - 0.5)

这清楚地表明 fun: 0.0 jac: array([0., 0.]) message: 'Optimization terminated successfully.' nfev: 8 nit: 2 njev: 2 status: 0 success: True x: array([0.5, 0.5]) 在整个区间内查找。

它并没有真正查看区间内的所有实数(这是不可能的,因为在任何区间都有无限实数)。相反,它使用您在 minimize() 参数中指定的优化算法。

答案 1 :(得分:-1)

表示为 OptimizeResult 对象的优化结果。重要的属性是: x 解决方案数组,success 一个布尔标志,指示优化器是否成功退出,以及描述终止原因的消息。