|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 jingjing122 于 2018-11-13 10:05 编辑
求教各位哥哥姐姐了!
一个很简单的物理问题,constraint1是描述运动距离关系, constraint2是描述速度关系,还有就是这个给的力是个向上的、跟重力方向相反的推力,所以这个力一定得是个正的值,所以constraint2_1就是一个不等式,写的F>=0。
很简单就是一个力推着物体向上运动,达到指定点s_goal=1.0的位置,输出x是一个nx3的矩阵,第一列是距离s,第二列是速度v,第三列是推力F,
目标函数objective function是:( si**2+e*vi**2),i=0到n-1,总和最小。 让optimizer求最优结果。
我感觉我这两个没有什么问题啊,可是总是会时不时有这个报错
message: 'Iteration limit exceeded'
nfev: 24442
nit: 101
njev: 101
status: 9
success: False
要哭了快
########更新一下,自己下午瞎调的时候发现把迭代时间t改成0.01s一次的时候,好像就解决了这个'Iteration limit exceeded'的问题,但同时有个新问题,就是这个e值,它只是个影响因子,想让速度在整个目标函数的占比降低一些,但不知道为什么调这个e的数值,比如从1调成0.01,也会有这个'Iteration limit exceeded'的报错,提示optimize False
code如下:
mass=10
t=0.01
g=10
s_goal=1.0
n=100
e=0.05
num=3
A = np.zeros((n,n))
for i in range (n):
A[0,i]=0
A[i,i-1]=1
#print('A matrix is \n %s'%(A))
B = np.zeros((n,n))
for i in range (n):
B[0,i]=0
B[i,i-1]=t
#print('B matrix is \n %s'%(B))
C = np.zeros((n,1))
for i in range (n):
C[i,0]=t*g
#print(np.shape(C))
D = t/mass*A
#print(D)
x0=np.zeros((n,num))
#x0[0,1]=1
#print(x0)
def constraint1(x):
x=x.reshape(n,num)
s=x[:,0].reshape(n,1)
v=x[:,1].reshape(n,1)
a=s-np.dot(A,s)-np.dot(B,v)
a=a.reshape(n,)
return a
def constraint2(x):
x=x.reshape(n,num)
v=x[:,1].reshape(n,1)
F=x[:,2].reshape(n,1)
qa=np.dot(D,F)
b=np.dot(A,v)+qa-C-v
b=b.reshape(n,)
return b
def constraint2_1(x):
x=x.reshape(n,num)
F=x[:,2].reshape(n,1)
F=F.reshape(n,)
return F
def objective(x):
x=x.reshape(n,num)
s=x[:,0].reshape(n,1)
v=x[:,1].reshape(n,1)
sum_up=0
for i in range (n):
sum_up = sum_up + (s[i,0]-s_goal)**2 + e*(v[i,0])**2
return sum_up
con1 = {'type':'eq','fun':constraint1}
con2 = {'type':'eq','fun':constraint2}
#con2_1 = {'type':'ineq','fun':constraint2}
cons = ([con1,con2])
solution = minimize(objective,x0,method='SLSQP',constraints=cons)
print(solution)
x=(solution.x).reshape(n,num)
position=x[:,0]
tn=np.linspace(0,n*t,n)
plt.plot(tn,position)
plt.ylabel('position')
plt.xlabel('time')
plt.legend(loc='best')
plt.show()
velocity=x[:,1]
y=velocity
plt.plot(tn,y)
plt.ylabel('velocity')
plt.xlabel('time')
plt.legend(loc='best')
plt.show()
forcepush=x[:,2]
plt.plot(tn,forcepush)
plt.ylabel('forcepush')
plt.xlabel('time')
plt.legend(loc='best')
plt.show() |
|