鱼C论坛

 找回密码
 立即注册
查看: 3311|回复: 8

optimize里Iteration limit exceeded的基础问题

[复制链接]
发表于 2018-11-13 01:01:47 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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()
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2018-11-13 10:47:28 | 显示全部楼层
现在我就很奇怪的就是,为什么一个系数e的值的调整,也会影响这个optimize的结果,e=1就True,e=0.01就False了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-11-13 11:07:41 | 显示全部楼层
可能这个系数就影响了你的最值能不能到0
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-11-13 11:32:59 | 显示全部楼层
塔利班 发表于 2018-11-13 11:07
可能这个系数就影响了你的最值能不能到0

哇 谢谢小哥哥,又是你的解答!
对e可以影响到position能不能到达目标点也就是goal point,但为什么e的值的改变会让整个code的optimize报错Iteration Limit exceed的呢?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-11-13 11:43:22 | 显示全部楼层
迭代问题。
你可以导入调试库
import pdb
在想要暂停看变量值的地方
输入:pdb.set_trace()
用:“p 变量” 查看一下

:希望对你有帮助
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-11-13 11:54:03 | 显示全部楼层
jingjing122 发表于 2018-11-13 11:32
哇 谢谢小哥哥,又是你的解答!
对e可以影响到position能不能到达目标点也就是goal point,但为什么e的 ...

但就是改变了,因为我也不清楚你对e的规划有没有,
还有引入这个参数的意义
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-11-13 12:21:42 | 显示全部楼层
塔利班 发表于 2018-11-13 11:54
但就是改变了,因为我也不清楚你对e的规划有没有,
还有引入这个参数的意义

e就是让整个目标函数中,速度的比重少占一点,因为速度值太大了,给它比例降一点。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-11-13 12:27:20 | 显示全部楼层
jingjing122 发表于 2018-11-13 12:21
e就是让整个目标函数中,速度的比重少占一点,因为速度值太大了,给它比例降一点。

但实际上你打印v[i,0],sum_up你会发现v挺小的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-11-13 12:38:51 | 显示全部楼层
是的,但是再降一点才能让position离目标更近哈,所以设置了个e调速度的占比
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2026-1-5 22:17

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表