鱼C论坛

 找回密码
 立即注册
查看: 5255|回复: 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的错误,希望大佬斧正,如果顺便帮我检查有没有其他错误就更好了,跪谢!

  1. 传递矩阵法
  2. import numpy as np
  3. import sympy as sym

  4. E = 2.06e11
  5. I = np.array([
  6.     0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08
  7. ])
  8. d = np.array([
  9.     0.025, 0.025, 0.025, 0.025, 0.025, 0.025, 0.025, 0.025, 0.025
  10. ])
  11. m = np.array([
  12.     0.308, 0.308, 9.21, 0.308, 0.308, 0.308, 0.308, 0.308, 0
  13. ])
  14. Id = np.array([
  15.     0, 0, 0.03196, 0, 0, 0, 0, 0, 0
  16. ])
  17. Io = np.array([
  18.     0, 0, 0.06392, 0, 0, 0, 0, 0, 0
  19. ])
  20. J = np.array([
  21.     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
  22. ])


  23. L = np.zeros([9,4,4])
  24. for i in np.arange(0,9):
  25.     L[i] = np.array([
  26.         [ 1 , I[i], I[i]**2/2/E/J[i], I[i]**3/6/E/J[i] ],
  27.         [ 0, 1, I[i]/E/J[i], I[i]**2/2/E/J[i] ],
  28.         [ 0, 0, 1, I[i] ],
  29.         [ 0, 0, 0, 1 ]
  30.     ])

  31. w = sym.symbols('w')

  32. M = np.zeros([9,4,4])
  33. for i in np.arange(0,9):
  34.     if i <= 1 or i >= 3:
  35.         M[i] = np.array([
  36.             [ 1, 0, 0, 0 ],
  37.             [ 0, 1, 1, 0 ],
  38.             [ 0, 0, 1, 0 ],
  39.             [ m[i]*w**2, 0, 0, 1 ]
  40.         ])
  41.     else:
  42.         M[i] = np.array([
  43.             [ 1, 0, 0, 0],
  44.             [ 0, 1, 0, 0 ],
  45.             [0, (Io[i]/Id[i]-1)*Id[i]*w**2, 1, 0 ],
  46.             [ m[i]*w**2, 0, 0, 1 ]
  47.         ])

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

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

  54. sym.solve(delta-w,w)
  55. print(w)
复制代码

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

不是什么库都兼容的啊
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

  29. for i=1:9

  30. if i<=2||i>=4
  31. M{1,i}=[1,        0,        0,        0;
  32. 0,        1,        0,        0;
  33. 0,        0,        1,        0;
  34. m(i)*w^2,        0,        0,        1];
  35. else
  36. M{1,i}=[1,        0,        0,        0;
  37. 0,        1,        0,        0;
  38. 0, ((Io(i)/Id(i))-1)*Id(i)*w^2, 1,        0;
  39. m(i)*w^2,        0,        0,        1];
  40. end
  41. end
  42. %*****************************************************************************
  43. %传递矩阵计算
  44. %左右两端的边界条件,转子两边看成是是简支的
  45. % BJ9=[0,Seta9,0,Q9];
  46. % BJ0=[0,Seta0,0,Q0];
  47. % 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}
  48. % *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
  49. 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}*...
  50. 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);
  51. %采用作图法,根据传递矩阵法的原理,画出Δ随Ω(轴的转速)
  52. %变化的曲线,曲线与Δ=0 时的水平轴交点频率就为临界转速。
  53. Drta=h12*h34-h14*h32;
  54. % w=200:1:1600;
  55. % plot(w,subs(Drta,w))%作图观察第一阶临界转速的变化趋势和 Drta=0 轴的交点
  56. %        xlabel('转速/rad/s','FontSize',10.5);ylabel('Δ值','FontSize',10.5);
  57. % grid on
  58. %*****************************************************************************
  59. % a=subs(Drta,w)
  60. % Drta=vpa(a)

  61. %采用试凑法,选定一系列的w 值,代入 Drta 式子中进行计算,得到一系列的 Drta 值,当Drta 值满足一定的
  62. %的精度时就可以认为此时的 W 值为临界转数。
  63. for w=200:1:400
  64. a=subs(Drta,w);
  65. if        a>=-0.01&&a<=0.001%计算精度的选取很重要,精度不能太小,否则得不到准确结果w1cor=w
  66. break
  67. end
  68. end
  69. %注意利用传递矩阵发计算转子的临界速度对 MATLAB 的计算精度有一定的要求,所以在计
  70. %算中一定要采用双精度数,且各个计算物理量都要采用国际单位,才能得到正确的临界转数
  71. %*****************************************************************************
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-16 22:48:50 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-4-17 18:04:24 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

不是什么库都兼容的啊
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

不是什么库都兼容的啊

我也是想过这个问题,可是如果用Python的话,还能有别的办法去解决这个问题吗?谢谢大佬指点!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

你可倒是把题目放出来啊
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-15 06:35

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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