我在3维空间中有两个二次曲面。
我想最小化两个物体之间的距离。函数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个参数的最佳值以最小化函数的值?
答案 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个常量保持不变。听起来不像您想要的。您已经使用alpha
,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
是此最小化方法的特殊输出。
答案 1 :(得分:0)
res = minimize(distance,
x0[0],
args=(*x0[1:],),
method='nelder-mead')
我想这就是你想要的。