我正在尝试使用fsolve,但它返回函数调用的Result不是一个正确的浮点数组 这是代码
如果我这样做,它就不起作用。
from sympy import *
B=symbols('B')
L=0.97
a = 0.04
b= 0.029
m = 4.8
I = 3.14*(a/2)*(b/2)**3/4
E = 10**10
ro = 900
A = 3.14*(a/2)*(b/2)
c = sqrt(E*I/(ro*A))
AA=Matrix([[0,-B**3,0,B**3],[-B**2,0,B**2,0],[B**4*c**2*m*(cos(B*L)) + E*I*(B**3*sin(B*L)), B**4*c**2*m*(sin(B*L))+ E*I*(- B**3*cos(B*L)),B**4*c**2*m*(cosh(B*L))+ E*I*(B**3*sinh(B*L)),B**4*c**2*m*(sinh(B*L))+ E*I*(B**3*cosh(B*L))],[-B**2*cos(B*L),- B**2*sin(B*L),B**2*cosh(B*L),B**2*sinh(B*L)]])
detA=AA.det()
from math import cosh, sinh, cos, sin
from scipy.optimize import fsolve
def func(B):
return detA
for i in range(1,15):
B0=fsolve(func,i)
print("B0=",B0)
print("w0=",B0**2*c)
但是如果我打印detA然后将其复制/粘贴到函数中,它就可以正常工作。
from math import cosh, sinh, cos, sin
from scipy.optimize import fsolve
def func(B):
return 5606.66666666667*B**11*sin(0.97*B)*cosh(0.97*B) - 5606.66666666667*B**11*cos(0.97*B)*sinh(0.97*B) + 478.634125*B**10*sin(0.97*B)**2 + 478.634125*B**10*cos(0.97*B)**2 - 957.26825*B**10*cos(0.97*B)*cosh(0.97*B) - 478.634125*B**10*sinh(0.97*B)**2 + 478.634125*B**10*cosh(0.97*B)**2
for i in range(1,15):
B0=fsolve(func,i)
print("B0=",B0)
print("w0=",B0**2*c)
我猜这是因为我使用了sympy,行列式不是浮点数,我怎么能将它变换为浮点数?
答案 0 :(得分:1)
使用lambdify
将符号表达式转换为可以用数字方式评估的函数:
func = sy.lambdify(B, detA)
import sympy as sy
import math
from scipy.optimize import fsolve
B = sy.symbols('B')
L = 0.97
a = 0.04
b = 0.029
m = 4.8
I = 3.14 * (a / 2) * (b / 2)**3 / 4
E = 10**10
ro = 900
A = 3.14 * (a / 2) * (b / 2)
c = sy.sqrt(E * I / (ro * A))
AA = sy.Matrix([[0, -B**3, 0, B**3], [-B**2, 0, B**2, 0], [B**4 * c**2 * m * (sy.cos(B * L)) + E * I * (B**3 * sy.sin(B * L)), B**4 * c**2 * m * (sy.sin(B * L)) + E * I * (- B**3 * sy.cos(B * L)), B**4 * c**2 * m * (sy.cosh(B * L)) + E * I * (B**3 * sy.sinh(B * L)), B**4 * c**2 * m * (sy.sinh(B * L)) + E * I * (B**3 * sy.cosh(B * L))], [-B**2 * sy.cos(B * L), - B**2 * sy.sin(B * L), B**2 * sy.cosh(B * L), B**2 * sy.sinh(B * L)]])
detA = AA.det()
func = sy.lambdify(B, detA)
def func2(B):
return 5606.66666666667*B**11*math.sin(0.97*B)*math.cosh(0.97*B) - 5606.66666666667*B**11*math.cos(0.97*B)*math.sinh(0.97*B) + 478.634125*B**10*math.sin(0.97*B)**2 + 478.634125*B**10*math.cos(0.97*B)**2 - 957.26825*B**10*math.cos(0.97*B)*math.cosh(0.97*B) - 478.634125*B**10*math.sinh(0.97*B)**2 + 478.634125*B**10*math.cosh(0.97*B)**2
assert abs(func(1) - func2(1)) < 1e-8
for i in range(1, 15):
B0 = fsolve(func, i)
print("B0=", B0)
print("w0=", B0**2 * c)