最小化多元函数

时间:2019-04-18 17:48:43

标签: python optimization scipy surface

我在3维空间中有两个二次曲面。

  • 一张圆形双曲面
    • 用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'

我发现所有documentation都只使用单变量(一个变量)函数(如Rosenbrock函数),尽管它说它最小化了“多元标量函数”。

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

2 个答案:

答案 0 :(得分:2)

好像您想改变所有四个参数。您将它们的初始值传递为 If the color found in the distinct array (which is empty) return empty array else return contents of array and color added to an empty array (4元素数组)。这就是x0将传递给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改变,并使其他3个常量保持不变。听起来不像您想要的。您已经使用alphaAB作为全局常量。

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']词典中的大多数项目在以下位置进行说明:

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

res是此最小化方法的特殊输出。

答案 1 :(得分:0)

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

我想这就是你想要的。