Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使力最小化的最佳轨迹,最终条件问题_Python_Optimization_Gekko - Fatal编程技术网

Python 使力最小化的最佳轨迹,最终条件问题

Python 使力最小化的最佳轨迹,最终条件问题,python,optimization,gekko,Python,Optimization,Gekko,我试图找到一条轨迹,它能使物体从一点移动到另一点的力的平方积分最小化。以下是系统动力学: dx/dt = v (derivative of position is velocity) dv/dt = u (derivative of velocity is acceleration, which is what I am trying to minimize) min integral of u**2 初始条件和最终条件为: x(0) = 0, v(0) = 0 x(1) = 1, v(1)

我试图找到一条轨迹,它能使物体从一点移动到另一点的力的平方积分最小化。以下是系统动力学:

dx/dt = v (derivative of position is velocity)
dv/dt = u (derivative of velocity is acceleration, which is what I am trying to minimize)
min integral of u**2
初始条件和最终条件为:

x(0) = 0, v(0) = 0
x(1) = 1, v(1) = 1
我已经使用Gekko库在python中实现了这一点,但是我无法使最终条件正常工作。使用
m.fix()
固定末端位置会使问题无法解决

在线阅读时,我使用了
m.Minimize()
来进行软约束,但解决方案与最终条件相差甚远。我添加了一个额外的方程式,使速度在结尾处小于零,这使得解看起来像是正确的解,尽管结尾位置是错误的(如果解按因子缩放,它将是正确的)

我应该妥善解决这个问题吗

from gekko import GEKKO
import numpy as np
import matplotlib.pyplot as plt

##model

m = GEKKO() # initialize gekko

nt = 101
m.time = np.linspace(0,1,nt)

# Variables
x = m.Var(value=0)
v = m.Var(value=0)

u = m.Var( fixed_initial=False)

p = np.zeros(nt) # mark final time point
p[-1] = 1.0
final = m.Param(value=p)

# Equations
m.Equation(x.dt()==v)
m.Equation(v.dt()==u)

#m.Equation(x*final >= 1) #@error: Solution Not Found
m.Equation(v*final <= 0)

m.Minimize(final*(x-1)**2)
m.Minimize(final*(v-0)**2)

m.Obj(m.integral(u**2)*final) # Objective function

m.options.IMODE = 6 # optimal control mode

##solve
m.solve() # solve

##plot
plt.figure(1) # plot results
plt.plot(m.time,x.value,'k-',label=r'$x$')
plt.plot(m.time,v.value,'b-',label=r'$v$')
plt.plot(m.time,u.value,'r--',label=r'$u$')
plt.legend(loc='best')
plt.xlabel('Time')
plt.ylabel('Value')

##show plot
plt.show()
从gekko导入gekko
将numpy作为np导入
将matplotlib.pyplot作为plt导入
##模型
m=GEKKO()#初始化GEKKO
nt=101
m、 时间=np.linspace(0,1,nt)
#变数
x=m.Var(值=0)
v=m.Var(值=0)
u=m.Var(固定首字母=False)
p=np.零(nt)#标记最终时间点
p[-1]=1.0
最终=m.Param(值=p)
#方程式
m、 方程(x.dt()==v)
m、 方程(v.dt()==u)
#m、 方程(x*final>=1)#@错误:未找到解决方案

m、 方程(v*final您可以通过在最终条件上增加权重来解决问题:

m.Minimize(最终*1e5*(x-1)**2)
m、 最小化(最终*1e5*(v-0)**2)
u
最小化仍有一些折衷,但它是最小的

final=0
时,约束
m.Equation(x*final>=1)
不可行,因为这会导致不等式
0>=1
。如果要使用最终位置约束,则需要使用
m.Equation((x-1)*final>=0)
,以便约束仅在末尾强制执行,但可行
(0>=0)
其他地方。最终条件不一定需要硬约束和软(目标函数)约束。下面是一个示例

从gekko导入gekko
将numpy作为np导入
将matplotlib.pyplot作为plt导入
m=GEKKO()#初始化GEKKO
nt=101;m.time=np.linspace(0,1,nt)
#变数
x=m.Var(值=0)
v=m.Var(值=0)
u=m.Var(固定首字母=False)
p=np.零(nt)#标记最终时间点
p[-1]=1.0
最终=m.Param(值=p)
#方程式
m、 方程(x.dt()==v)
m、 方程(v.dt()==u)
m、 方程((x-1)*最终>=0)

m、 方程式(v*最后一点,谢谢。还有一个问题-你知道如何使“u”最初不为零吗?我将fixed_initial设置为False,但默认情况下它似乎仍将其设置为零。这个问题的解析解最初将“u”设置为非零值。初始条件不会改变解决方案。这是第二个时间步骤,并且会产生影响更改解决方案。如果它不影响解决方案,则应将其设置为零,以最小化
u**2
。如果希望绘图看起来更好,可以将初始条件更改为等于第二时间步,即u.value[0]=u.value[1]。以下是相关帖子: