Python 最小化多变量函数

Python 最小化多变量函数,python,optimization,scipy,surface,Python,Optimization,Scipy,Surface,我在三维空间有两个二次曲面 单叶圆双曲面 由xt、yt、zt、rt描述 圆抛物面 由xs、ys、zs、rs描述 我想最小化两个对象之间的距离。函数distance()接受4个变量-alpha、beta、zt和zs。目标是找到函数返回最小可能值的这4个变量的值 考虑下面的代码 import numpy as np from scipy.optimize import minimize A = 1; B = 1; C = 1; D = 1; Z = 0; def distance(a

我在三维空间有两个二次曲面

  • 单叶圆双曲面
    • 由xt、yt、zt、rt描述
  • 圆抛物面
    • 由xs、ys、zs、rs描述
我想最小化两个对象之间的距离。函数
distance()
接受4个变量-alpha、beta、zt和zs。目标是找到函数返回最小可能值的这4个变量的值

考虑下面的代码

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()缺少3个必需的位置参数:“beta”, “zt”和“zs”

我所发现的只是使用单变量函数(比如Rosenbrock函数),尽管它说它最小化了“多变量标量函数”

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

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

我想这就是你想要的。

看起来你想要改变所有四个参数。将其初始值传递为4元素数组
x0
。这就是
minimize
将传递给
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个常量。这听起来不像你想要的。您已经将
A
B
C
用作全局常量

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
词典中的大多数条目解释如下:


final\u simplex
是此最小化方法的特殊输出。

文档说明了如何在
args
中传递目标函数的额外参数,您尝试过吗?现在,程序无法自行推断调用函数
distance
时要使用的
beta
zt
zs
的值,从而导致错误。我不知道如何使用
args
参数。我对Python非常陌生,似乎没有任何示例。你能帮我找出参数
alpha
beta
zt
zs
的正确值吗?顺便说一下,我不知道
x0=np.array([0,0,0,0])
是否有效。我只是编了一些数字。我如何知道什么是合理的“初始猜测”?完整的
res
包括
x
res['x']
因此对于
alpha=-1.21456543
beta=-1.21455457
zt=0.9999797
zs=0.9997757
函数
distance()
的最小可能值等于
2.4938000073954824e-10
?@Slazer确实如此。所以我认为这可能是正确的答案。这只会在
print(res.x)
print(res.fun)
之后给我
[0.00025]
。这是不正确的,因为对于
alpha
beta
zt
zs
等于
[-1.21456543,--1.21455458,0.9999797,0.9997757]
函数值是
2.4938000073954824e-10
,这要少得多。