鱼C论坛

 找回密码
 立即注册
查看: 1859|回复: 9

关于一个迭代函数为什么会有too many indices for array

[复制链接]
发表于 2018-9-25 07:52:21 | 显示全部楼层 |阅读模式

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

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

x
求问大神神们,我这个函数就是两个constraints,满足距离和速度的一个条件即可
s1=s0+t*v0
s2=s1+t*v1
s3=s2+t*v2
s4=s3+t*v3
s5=s4+t*v4
然后把上面这个迭代式写成了矩阵 s=A点乘s+B点乘v
同理速度的式子长得类似

然后S V F(外部作用力),三个建成一个5x3的矩阵来找最优值,为什么会有如下报错啊:
s=x[:,0].reshape(5,1)

IndexError: too many indices for array

代码如下:

import numpy as np
from scipy.optimize import minimize


t=0.01
m=1000
g=-9.8
#goal point
s_g=1.0


A = np.zeros((5,5))
for i in range (5):
    A[0][i]=0
    A[i][i-1]=1
print('A matrix is \n %s'%(A))
B = np.zeros((5,5))
for i in range (5):
    B[0][i]=0
    B[i][i-1]=t
print('B matrix is \n %s'%(B))


#建立 x v F 的矩阵 且所有初值为0
x0=np.zeros((5,3))
print('x v F 初始值为0的初矩阵 \n %s'%(x0))
print (np.shape(x0))

def constraint1(x):
    s=x[:,0].reshape(5,1)
    v=x[:,1].reshape(5,1)
    return s-np.dot(A,s)-np.dot(B,v)

def constraint2(x):
    F=x[:,2].reshape(5,1)
    v=x[:,1].reshape(5,1)
    C = np.zeros(5,1)
    for i in range(5):
        C[i][0]= t*(F[i][0]+m*g)/m
    return v-np.dot(A,v)-C

def objective(x):
    s=x[:,0].reshape(5,1)
    v=x[:,1].reshape(5,1)
    F=x[:,2].reshape(5,1)
    for i in range (5):
        sum = (s[i-1][0]+t*v[i-1][0]-s_g)**2 + (v[i-1][0]+t*(F[i-1][0]+m*g)/m)**2
    return sum

# optimize
con1 = {'type':'eq','fun':constraint1}
con2 = {'type':'eq','fun':constraint2}
cons = ([con1,con2])
solution = minimize(objective,x0,method='SLSQP',constraints=cons)

   
   
   
愁死啦,拜托大神神们指点我一下呀!感激不尽
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2018-9-25 07:56:28 | 显示全部楼层
我建立的s v F 的5x3矩阵就是想 第一列表示S0,S1,S2,S3,S4,然后第二列v0,v1,v2,v3,v4,第三列F0,F1,F2,F3,F,4
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-9-25 08:29:45 | 显示全部楼层
求大神帮我看看哇
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-9-25 08:56:24 | 显示全部楼层
我把最后几行optimize下面的先删掉了
# optimize
con1 = {'type':'eq','fun':constraint1}
con2 = {'type':'eq','fun':constraint2}
cons = ([con1,con2])
solution = minimize(objective,x0,method='SLSQP',constraints=cons)
删掉之后,给了一个测试用的x矩阵
#test input x
x=np.array([[1,6,11],
            [2,7,12],
            [3,8,13],
            [4,9,14],
            [5,10,15]])
一个一个函数测试下来没有问题,那么这个optimize.minimize 函数为什么不成功啊??? 是因为constraint函数里return出来的是一个5x1的列向量,那contraint里还用‘eq’ 对吗??可以直接让一组向量=0吗??
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-25 09:19:17 | 显示全部楼层
con1 = {'type':'eq','fun':constraint1}
con2 = {'type':'eq','fun':constraint2}
函数运行结果为0,constraint1,2结果都是向量吧,不会是0吧,
不知道我理解对不对,我百度了半天,numpy,scipy完全没用过
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-9-25 10:19:09 | 显示全部楼层
塔利班 发表于 2018-9-25 09:19
con1 = {'type':'eq','fun':constraint1}
con2 = {'type':'eq','fun':constraint2}
函数运行结果为0,cons ...

哇小哥哥又是你!感谢你!
对 constraints函数return的都是5x1的向量,我查了半天感觉是不是optimize函数不支持向量。
头大。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-25 10:21:51 | 显示全部楼层
jingjing122 发表于 2018-9-25 10:19
哇小哥哥又是你!感谢你!
对 constraints函数return的都是5x1的向量,我查了半天感觉是不是optimize函 ...

你把向量的每一个元素用函数试试
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-9-25 10:58:07 | 显示全部楼层
塔利班 发表于 2018-9-25 10:21
你把向量的每一个元素用函数试试

哇感谢你这个思路!我试试!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-9-25 22:49:16 | 显示全部楼层
塔利班 发表于 2018-9-25 10:21
你把向量的每一个元素用函数试试

好奇怪啊,我明明已经把每个向量都提出来了,用测试矩阵 测也没问题,就是一加上optimize函数就报IndexError: too many indices for array 快哭了


def constraint1(x):
    s=x[:,0].reshape(5,1)
    v=x[:,1].reshape(5,1)
    a=s-np.dot(A,s)-np.dot(B,v)
    return a

def constraint2(x):
    F=x[:,2].reshape(5,1)
    v=x[:,1].reshape(5,1)
    C = np.zeros((5,1))
    for i in range(5):
        C[i][0]= t*(F[i][0]+m*g)/m
    b=v-np.dot(A,v)-C
    return b

def objective(x):
    s=x[:,0].reshape(5,1)
    v=x[:,1].reshape(5,1)
    F=x[:,2].reshape(5,1)
    for i in range (5):
        sum = (s[i-1][0]+t*v[i-1][0]-s_g)**2 + (v[i-1][0]+t*(F[i-1][0]+m*g)/m)**2
    return sum


#the two results a,b above are two vectors
for i in range (5):
    def constraint11(x):
        #print('shiyan')
        #print (constraint1(x)[i,0])
        return constraint1(x)[i,0]
    p=constraint11(x)
    print('test cons1 value is \n %s'%(p))
   
    def constraint22(x):
        #print('shiyan')
        #print (constraint1(x)[i,0])
        return constraint2(x)[i,0]
    q=constraint22(x)
    print('test cons2 value is \n %s'%(q))
   
    con1 = {'type':'eq','fun':constraint11}
    con2 = {'type':'eq','fun':constraint22}
    cons = ([con1,con2])
    solution = minimize(objective,x0,method='SLSQP',constraints=cons)
   
为了提出cons1和cons2的同一r行,用了for循环
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-26 08:32:17 | 显示全部楼层
cons的内容要求结果为0的,你的还是向量
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-10-7 08:24

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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