Optimal trajectory to minimize force, issues with final conditions

谁说我不能喝 提交于 2021-02-10 09:47:58

问题


I am trying to find a trajectory that minimizes the squared integral of the force to move a block from one point to another. Here are the system dynamics:

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

The initial conditions and final conditions are:

x(0) = 0, v(0) = 0
x(1) = 1, v(1) = 1

I have implemented this in python using the Gekko library, but I cannot get the final conditions working properly. Using m.fix() to fix the end position makes the problem unsolvable.

Reading online, I used m.Minimize() to make a soft constraint, but the solution was very far off from the end conditions. I added an extra equation to make the velocity less than zero at the end, and that made the solution look like the correct solution, albeit the end position was wrong (if the solution was scaled by a factor, it would be correct).

I should I properly solve this problem?

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()

Plot of my results


回答1:


You can fix the problem by putting a higher weight on the final conditions:

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

There is still some tradeoff with the u minimization but it is minimal.

The constraint m.Equation(x*final >= 1) is infeasible when final=0 because this results in the inequality 0 >= 1. If you'd like to use the final position constraint, you'll need to use m.Equation((x-1)*final >= 0) so that the constraint is enforced only at the end but is feasible (0 >= 0) elsewhere. You don't necessarily need the hard constraints with the soft (objective function) constraints for the final condition. Here is a related problem with an inverted pendulum.

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

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-1)*final >= 0)
m.Equation(v*final <= 0)
m.Minimize(final*1e5*(x-1)**2)
m.Minimize(final*1e5*(v-0)**2)
m.Obj(m.integral(u**2)*final) # Objective function
m.options.IMODE = 6 # optimal control mode

m.solve() # solve

plt.figure(1) # plot results
plt.grid()
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')
plt.show()


来源:https://stackoverflow.com/questions/61219294/optimal-trajectory-to-minimize-force-issues-with-final-conditions

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!