【问题标题】:How can I fix this error? ValueError and TypeError. Slider我该如何解决这个错误?值错误和类型错误。滑块
【发布时间】:2020-12-05 14:02:36
【问题描述】:

问题:

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

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

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

总结

我有一个 sympy 函数(“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()

我尝试了很多,但我无法修复它,请帮助,谢谢。

【问题讨论】:

  • 请提供预期的MRE。在故障点跟踪有问题的值。
  • grap_plot, = mplt.plot(x,F,'r') 线错误。
  • 我有一个 sympy 函数(“U”),U 取决于 x 和 t,它们是符号变量,然后我使用 lambdify 从 sympy 切换到 numpy,因为我想使用滑块绘制 U这取决于 t,但我不能。

标签: python numpy matplotlib slider sympy


【解决方案1】:

sympy documentation 表明lambdify 的返回是一个函数。因此,当您根据范围绘制此图时,matplotlib 会感到困惑,因为它需要两个等长的数组类型。然后您必须使用您的 lambda 生成点。

plt.plot(x, F(x), 'r', label = 'Fixed function')

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

【讨论】:

  • 我有一个 sympy 函数(“U”),U 取决于 x 和 t,它们是符号变量,然后我使用 lambdify 将 U 从 sympy 切换到 numpy,因为我想使用取决于 t 的滑块,但我不能。 U[x,t]、x[0,1] 和 t [0,10]。实际上我对 Mathematica Wolfram 也做了同样的事情,但我不喜欢,这就是我改用 Python 的原因。
  • 你说的我试过了,还是不行。 float() argument must be a string or a number, not 'function
  • 尝试使用print(F(x)) 来查看F(x) 是什么类型。它应该是一个数组类型,您可以查看 sympy 文档以了解如何将其转换为 matplotlib 很乐意针对 x 绘制的东西。
  • 我解决了这个错误,现在我无法使滑块工作... TypeError: unsupported operand type(s) for *: 'float' and 'Slider'
  • 我很高兴你修复了它,你最好多阅读一些关于 python 如何作为一种语言工作的信息。目前,您似乎在不了解语法的情况下将其用作工具;这只会让你到目前为止。如果您有时间购买一本书或观看一些免费的在线视频和课程,您对语言的理解就会突飞猛进,因此您会发现它有用的任务数量以及您可以做的事情将会增加也是。
【解决方案2】:

我解决了 2 个错误,但我还有一个错误,当我运行代码时一切正常,但当我使用滑块时,出现类型错误。

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'

【讨论】:

    【解决方案3】:

    一切都很好,谢谢

    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()
    
    

    【讨论】:

      猜你喜欢
      • 2021-06-11
      • 2016-07-21
      • 2016-09-09
      • 2021-04-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多