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
,这要少得多。