最小化多变量函数

Minimize multivariable function

我有两个三维的二次曲面 space。

我想尽量缩短两个物体之间的距离。函数 distance() 有 4 个变量 - alpha、beta、zt 和 zs。目标是找到这 4 个变量的值,使函数 returns 成为最小可能值。

考虑下面的代码。

import numpy as np
from scipy.optimize import minimize

A = 1; B = 1; C = 1; D = 1; Z = 0;

def distance(alpha,beta,zt,zs):
    """distance between points in 2 quadric surfaces in 3D space"""
    rt = (A/B) * np.sqrt(B**2 + (zt-C)**2)
    xt = rt * np.cos(alpha)
    yt = rt * np.sin(alpha)

    rs = D * np.sqrt(zs-Z)
    xs = rs * np.cos(beta)
    ys = rs * np.sin(beta)

    return (xt-xs)**2 + (yt-ys)**2 + (zt-zs)**2

x0 = np.array([0, 0, 0, 0])
res = minimize(distance,
               x0,
               method='nelder-mead')

代码给出了以下错误。

TypeError: distance() missing 3 required positional arguments: 'beta', 'zt', and 'zs'

所有 documentation 我发现只使用单变量(一个变量)函数(如 Rosenbrock 函数),尽管它说它最小化 "multivariate scalar functions".

如何让我的代码找到 4 个参数的最佳值以最小化函数的值?

res = minimize(distance,
           x0[0],
           args=(*x0[1:],),
           method='nelder-mead')

我想这就是你想要的。

您似乎想改变所有四个参数。您将它们的初始值作为 x0 传递,这是一个 4 元素数组。这就是 minimize 将传递给 distance 的内容。这是对 distance 的更改,应该适用于此:

def distance(x):
    """distance between points in 2 quadric surfaces in 3D space"""
    alpha,beta,zt,zs = x    # unpack x into these 4 variables
    rt = (A/B) * np.sqrt(B**2 + (zt-C)**2)
    xt = rt * np.cos(alpha)
    yt = rt * np.sin(alpha)

    rs = D * np.sqrt(zs-Z)
    xs = rs * np.cos(beta)
    ys = rs * np.sin(beta)

    return (xt-xs)**2 + (yt-ys)**2 + (zt-zs)**2

args 建议会有所不同 alpha 并保持其他 3 个不变。这听起来不像你想要的。您已经使用 ABC 作为全局常量。

1115:~/mypy$ python3 stack55751317.py 
 final_simplex: (array([[-1.21456543, -1.21455458,  0.99997997,  0.99997757],
       [-1.21457508, -1.21458998,  0.9999941 ,  1.00000714],
       [-1.21461728, -1.21460427,  1.00002695,  1.00001266],
       [-1.21456081, -1.2145312 ,  0.99996329,  0.99996864],
       [-1.2146315 , -1.21462741,  1.00002628,  1.00004968]]), array([2.49380001e-10, 4.04824635e-10, 4.13486388e-10, 1.15131206e-09,
       1.18130671e-09]))
           fun: 2.4938000073954824e-10
       message: 'Optimization terminated successfully.'
          nfev: 295
           nit: 172
        status: 0
       success: True
             x: array([-1.21456543, -1.21455458,  0.99997997,  0.99997757])

x 看起来像结果,您可以使用 res['x'].

访问它

res 词典中的大部分条目解释如下:

https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.OptimizeResult.html#scipy.optimize.OptimizeResult

final_simplex 是这种最小化方法的特殊输出。