如何解决此错误? ValueError和TypeError。滑杆

时间:2020-08-16 06:29:18

标签: python numpy matplotlib slider sympy

问题:

TypeError:float()参数必须是字符串或数字,而不是“函数”

ValueError:x和y必须具有相同的第一尺寸,但形状为(10,)和(1,)

第32行grap_plot,= mplt.plot(x,F,'r')

摘要

我有一个符号函数(“ U”),U依赖于x和t(它们是符号变量),然后我使用lambdify从sympy切换为numpy,因为我想使用依赖于t的滑块来绘制U,但是我不能

from sympy import *
import numpy as np
from sympy.plotting import plot
import matplotlib.pyplot as mplt
from matplotlib.widgets import Slider
init_printing()
( x, t, n) = symbols('x t n' , positive = True)
Ro= Rational(10,1)**-3 #[Kg/m]
T= Rational(49) #[N]
L = Rational(1) #[m]
c = sqrt(T/Ro)
f = x*(x-1)**2
b = simplify((2/L)*integrate(f*sin(n*pi*x/L),(x,0,L)))
U = expand(summation(b*sin(n*pi*x/L)*cos(c*n*pi*t/L),(n,1,10)))
U0 = simplify(U.subs({t:0}))
mplt.style.use('seaborn-whitegrid')
p = plot(f,(x,0,L))
F = (lambdify(['x','t'], U ,'numpy'))
F0 = (lambdify('x', U0,'numpy'))
x = np.arange(0, L, 0.1)
fig = mplt.figure(figsize=(8,3))
grap_ax = mplt.axes([0.1, 0.2, 0.8, 0.65])
slider_ax = mplt.axes([0.1, 0.05, 0.8, 0.05])
mplt.axes(grap_ax) 
mplt.title('Movimiento de la cuerda')
grap_plot, = mplt.plot(x,F,'r')
mplt.xlim(0, L)
mplt.ylim(-0.15, 0.15)
t_slider = Slider(slider_ax,'t',1, 10,0)
def update(t):
    grap_plot.set_ydata(F) 
    fig.canvas.draw_idle()     
t_slider.on_changed(update)
mplt.show()

我已经尝试了很多,但是无法解决,请提供一些帮助,谢谢。

3 个答案:

答案 0 :(得分:0)

sympy documentation表明plt.plot(x, F(x), 'r', label = 'Fixed function') 的返回是一个函数。当您针对范围绘制此内容时,由于期望两个相等长度的数组类型,因此matplotlib会感到困惑。然后,您必须使用Lambda生成点。

{{1}}

这将修复这两个错误-您将传递两个长度相等且类型相同的数组。

答案 1 :(得分:0)

我解决了2个错误,但是还有另一个错误,当我运行代码时一切都很好,但是当我使用滑块时,出现了Type错误。

from sympy import *
import numpy as np
from sympy.plotting import plot
import matplotlib.pyplot as mplt
from matplotlib.widgets import Slider
init_printing()
( x, t, n) = symbols('x t n' , positive = True)
Ro= Rational(10,1)**-3 #[Kg/m]
T= Rational(49) #[N]
L = Rational(1) #[m]
c = sqrt(T/Ro)
f = x*(x-1)**2
b = simplify((2/L)*integrate(f*sin(n*pi*x/L),(x,0,L)))
U = expand(summation(b*sin(n*pi*x/L)*cos(c*n*pi*t/L),(n,1,10)))
u = b*sin(n*pi*x/L)*cos(c*n*pi*t/L)
freq = nfloat(n*c/(2*L),6)
Peri = nfloat(1/freq,3)
for i in range (1,4):
    init_printing()
    display(u.subs({n:i}))
    display(freq.subs({n:i}))
    display(Peri.subs({n:i}))
mplt.style.use('seaborn-whitegrid')
p = plot(f,(x,0,L))
F = lambdify(['x','t'], U ,'numpy')
x = np.arange(0,1,0.1)
t_init = 0.
fig = mplt.figure(figsize=(8,3))
grap_ax = mplt.axes([0.1, 0.2, 0.8, 0.65])
slider_ax = mplt.axes([0.1, 0.05, 0.8, 0.05])
mplt.axes(grap_ax) 
mplt.title('Movimiento de la cuerda')
grap_plot, = mplt.plot(x,F(x,t_init),'r')
mplt.xlim(0, 1)
mplt.ylim(-0.15, 0.15)
t_slider = Slider(slider_ax,'t',0., 10., valinit=t_init)
def update(t):
    grap_plot.set_ydata(F(x,t_slider)) 
    fig.canvas.draw_idle()     
t_slider.on_changed(update)
mplt.show()

TypeError:不支持的操作数类型:“ float”和“ Slider”

答案 2 :(得分:0)

一切都很好,谢谢

from sympy import *
import numpy as np
from sympy.plotting import plot
import matplotlib.pyplot as mplt
from matplotlib.widgets import Slider
init_printing()
( x, t, n) = symbols('x t n' , positive = True)
Ro= Rational(10,1)**-3 #[Kg/m]
T= Rational(49) #[N]
L = Rational(1) #[m]
c = sqrt(T/Ro)
f = x*(x-1)**2
b = simplify((2/L)*integrate(f*sin(n*pi*x/L),(x,0,L)))
U = expand(summation(b*sin(n*pi*x/L)*cos(c*n*pi*t/L),(n,1,10)))
u = b*sin(n*pi*x/L)*cos(c*n*pi*t/L)
freq = nfloat(n*c/(2*L),6)
Peri = nfloat(1/freq,3)
for i in range (1,4):
    init_printing()
    display(u.subs({n:i}))
    display(freq.subs({n:i}))
    display(Peri.subs({n:i}))
mplt.style.use('seaborn-whitegrid')
p = plot(f,(x,0,L))

F = lambdify(['x','t'], U ,'numpy')
x = np.arange(0,1,0.1)
t_init = 0
fig = mplt.figure(figsize=(8,3))
grap_ax = mplt.axes([0.1, 0.2, 0.8, 0.65])
slider_ax = mplt.axes([0.1, 0.05, 0.8, 0.05])
mplt.axes(grap_ax) 
mplt.title('Movimiento de la cuerda')
grap_plot, = mplt.plot(x,F(x,t_init),'r')
mplt.xlim(0, 1)
mplt.ylim(-0.15, 0.15)
t_slider = Slider(slider_ax,'t',0, 10, valinit=t_init,valfmt="%i")
def update(t):
    grap_plot.set_ydata(F(x,t)) 
    fig.canvas.draw_idle()     
t_slider.on_changed(update)
mplt.show()