鱼C论坛

 找回密码
 立即注册
查看: 4979|回复: 6

[已解决]关于sympy和numpy的使用问题:can't convert expression to float

[复制链接]
发表于 2020-4-16 16:25:52 | 显示全部楼层 |阅读模式

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

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

x
问题描述:本人Python初学者,最近在完成老师所写的大作业,写了一段代码,发现在使用numpy数组时在  M[]  处出现can't convert expression to float的错误,希望大佬斧正,如果顺便帮我检查有没有其他错误就更好了,跪谢!
传递矩阵法
import numpy as np
import sympy as sym

E = 2.06e11
I = np.array([
    0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08
])
d = np.array([
    0.025, 0.025, 0.025, 0.025, 0.025, 0.025, 0.025, 0.025, 0.025
])
m = np.array([
    0.308, 0.308, 9.21, 0.308, 0.308, 0.308, 0.308, 0.308, 0
])
Id = np.array([
    0, 0, 0.03196, 0, 0, 0, 0, 0, 0
])
Io = np.array([
    0, 0, 0.06392, 0, 0, 0, 0, 0, 0
])
J = np.array([
    1.917e-8 ,1.917e-8 ,1.917e-8 ,1.917e-8 ,1.917e-8 ,1.917e-8 ,1.917e-8 ,1.917e-8 ,1.917e-8
])


L = np.zeros([9,4,4])
for i in np.arange(0,9):
    L[i] = np.array([
        [ 1 , I[i], I[i]**2/2/E/J[i], I[i]**3/6/E/J[i] ],
        [ 0, 1, I[i]/E/J[i], I[i]**2/2/E/J[i] ],
        [ 0, 0, 1, I[i] ],
        [ 0, 0, 0, 1 ]
    ])

w = sym.symbols('w')

M = np.zeros([9,4,4])
for i in np.arange(0,9):
    if i <= 1 or i >= 3:
        M[i] = np.array([
            [ 1, 0, 0, 0 ],
            [ 0, 1, 1, 0 ],
            [ 0, 0, 1, 0 ],
            [ m[i]*w**2, 0, 0, 1 ]
        ])
    else:
        M[i] = np.array([
            [ 1, 0, 0, 0],
            [ 0, 1, 0, 0 ],
            [0, (Io[i]/Id[i]-1)*Id[i]*w**2, 1, 0 ],
            [ m[i]*w**2, 0, 0, 1 ]
        ])

#print(M)
H = np.zero([4,4])
for i in np.arange(0,9):
    H[i] *= M[i] * L[i]

h12, h14, h34, h32 = H[1,2], H[1,4], H[3,4], H[3,2]
delta = h12 * h34 - h14 * h32

sym.solve(delta-w,w)
print(w)
最佳答案
2020-4-17 18:32:36
m = np.array([
    0.308, 0.308, 9.21, 0.308, 0.308, 0.308, 0.308, 0.308, 0
])
w = sym.symbols('w')
M[i] = np.array([
            [ 1, 0, 0, 0 ],
            [ 0, 1, 1, 0 ],
            [ 0, 0, 1, 0 ],
            [ m[i]*w**2, 0, 0, 1 ]
        ])
跨库调用,有点NB

不是什么库都兼容的啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-4-16 16:27:21 | 显示全部楼层
附上原来的MATLAB代码
%Rotor critical speed calculation 转子临界转速计算
%*****************************************************************************
%转子数据
E=2.06e11;%轴的弹性模量 N/m2
l=[0.08,0.08,0.08,0.08,0.08,0.08,0.08,0.08,0.08];%轴总长为 72cm,分成 9 段每段的长度相等都是 0.08m
d=[0.025,0.025,0.025,0.025,0.025,0.025,0.025,0.025,0.025];%轴的直径 m
m=[0.308,0.308,9.21,0.308,0.308,0.308,0.308,0.308,0];%各段的质量
Id=[0,0,0.03196,0,0,0,0,0,0];% 直 径 转 动 惯 量 kg*m2 
Io=[0,0,0.06392,0,0,0,0,0,0];%极转动惯量
J=[1.917e-8,1.917e-8,1.917e-8,1.917e-8,1.917e-8,1.917e-8,1.917e-8,1.917e-8,1.917e-8];%J 为各段面积惯性矩,J=pi*d^4/64
% E=2.06e7 %轴的弹性模量 N/cm2
% l=[8,8,8,8,8,8,8,8,8];%轴总长为 72cm,分成 9 段每段的长度相等都是 8cm
% d=[2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5,2.5];%轴的直径
% m=[0.308,0.308,9.21,0.308,0.308,0.308,0.308,0.308,0];%各段的质量
% Id=[0,0,319.6,0,0,0,0,0,0];%直径转动惯量
% Io=[0,0,639.2,0,0,0,0,0,0];%极转动惯量
% J=[1.917,1.917,1.917,1.917,1.917,1.917,1.917,1.917,1.917];%J 为各段面积惯性矩,J=pi*d^4/64
%*****************************************************************************
%1-9 段的传递矩阵 L clc
L=cell(1,9);
for i=1:9
L{1,i}=[1,l(i),(l(i))^2/(2*E*J(i)),(l(i))^3/(6*E*J(i));
0,        1,        l(i)/(E*J(i)),        (l(i))^2/(2*E*J(i));
0,        0,        1,        l(i);
0,        0,        0,        1];
end
%1-9 站的传递矩阵 M M=cell(1,9);
syms w;
 
for i=1:9

if i<=2||i>=4
M{1,i}=[1,        0,        0,        0;
0,        1,        0,        0;
0,        0,        1,        0;
m(i)*w^2,        0,        0,        1];
else
M{1,i}=[1,        0,        0,        0;
0,        1,        0,        0;
0, ((Io(i)/Id(i))-1)*Id(i)*w^2, 1,        0;
m(i)*w^2,        0,        0,        1];
end
end
%*****************************************************************************
%传递矩阵计算
%左右两端的边界条件,转子两边看成是是简支的
% BJ9=[0,Seta9,0,Q9];
% BJ0=[0,Seta0,0,Q0];
% BJ9=M{1,9}*L{1,9}*M{1,8}*L{1,8}*M{1,7}*L{1,7}*M{1,6}*L{1,6}*M{1,5}*L{1,5}
% *M{1,4}*L{1,4}*M{1,3}*L{1,3}*M{1,2}*L{1,2}*M{1,1}*L{1,1}*BJ0
H4x4=M{1,9}*L{1,9}*M{1,8}*L{1,8}*M{1,7}*L{1,7}*M{1,6}*L{1,6}*M{1,5}*L{1,5}*...
M{1,4}*L{1,4}*M{1,3}*L{1,3}*M{1,2}*L{1,2}*M{1,1}*L{1,1}; h12=H4x4(1,2);h14=H4x4(1,4);h32=H4x4(3,2);h34=H4x4(3,4);
%采用作图法,根据传递矩阵法的原理,画出Δ随Ω(轴的转速)
%变化的曲线,曲线与Δ=0 时的水平轴交点频率就为临界转速。
Drta=h12*h34-h14*h32;
% w=200:1:1600;
% plot(w,subs(Drta,w))%作图观察第一阶临界转速的变化趋势和 Drta=0 轴的交点
%        xlabel('转速/rad/s','FontSize',10.5);ylabel('Δ值','FontSize',10.5);
% grid on
%*****************************************************************************
% a=subs(Drta,w)
% Drta=vpa(a)
 
%采用试凑法,选定一系列的w 值,代入 Drta 式子中进行计算,得到一系列的 Drta 值,当Drta 值满足一定的
%的精度时就可以认为此时的 W 值为临界转数。
for w=200:1:400
a=subs(Drta,w);
if        a>=-0.01&&a<=0.001%计算精度的选取很重要,精度不能太小,否则得不到准确结果w1cor=w
break
end
end
%注意利用传递矩阵发计算转子的临界速度对 MATLAB 的计算精度有一定的要求,所以在计
%算中一定要采用双精度数,且各个计算物理量都要采用国际单位,才能得到正确的临界转数
%*****************************************************************************
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-16 22:48:50 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-4-17 18:04:24 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-4-17 18:32:36 | 显示全部楼层    本楼为最佳答案   
m = np.array([
    0.308, 0.308, 9.21, 0.308, 0.308, 0.308, 0.308, 0.308, 0
])
w = sym.symbols('w')
M[i] = np.array([
            [ 1, 0, 0, 0 ],
            [ 0, 1, 1, 0 ],
            [ 0, 0, 1, 0 ],
            [ m[i]*w**2, 0, 0, 1 ]
        ])
跨库调用,有点NB

不是什么库都兼容的啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-17 19:39:47 | 显示全部楼层
永恒的蓝色梦想 发表于 2020-4-17 18:32
跨库调用,有点NB

不是什么库都兼容的啊

我也是想过这个问题,可是如果用Python的话,还能有别的办法去解决这个问题吗?谢谢大佬指点!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-17 21:22:39 | 显示全部楼层
xxfholic 发表于 2020-4-17 19:39
我也是想过这个问题,可是如果用Python的话,还能有别的办法去解决这个问题吗?谢谢大佬指点!

你可倒是把题目放出来啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-26 14:34

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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