不支持的操作数类型:'_io.TextIOWrapper' 和 'float

1 投票
1 回答
5458 浏览
提问于 2025-04-17 19:15

我在尝试编译以下程序时遇到了一个错误信息。这个程序的目的是分析一个非线性摆的行为,以及一个特定的庞加莱截面。我试图把摆的行为数据打印到一个文件里,把对应于庞加莱截面的输出打印到另一个文件。

在Python的控制台中显示的错误信息是:

Traceback (most recent call last):
File "C:\Python32\Lib\site-packages\visual\examples\JMB312.py", line 39
    thetaDotDot = -(g / L) * sin(theta) - q * thetaDot + Fd * sin(Ohm * t)
TypeError: unsupported operand type(s) for /: '_io.TextIOWrapper' and 'float'

我真的不明白为什么这个错误中提到了io.TextIOWrapper,也不知道该如何解决这个问题。任何帮助都非常感谢!

代码如下:

from visual import *
from visual.graph import *

scene.title = 'Pendulum'
scene.autoscale = False
scene.height = scene.width = 500
pivot = array([0,0,0])      # pivot position of pendulum
scene.center = pivot            # center scene on pendulum pivot
framesPerSecond = 400

myWindow1 = gdisplay(x=500, title = "Phase Space", xtitle="Theta", ytitle="ThetaDot", height=500, width=500)
f1 = gdots(gdisplay=myWindow1, color = color.cyan, size = 1)

myWindow2 = gdisplay(title="Poincare Section", xtitle="Theta", ytitle="ThetaDot",y=400, x=500, height=500, width=500)
f2 = gdots(gdisplay=myWindow2, color = color.yellow)

#initial conditions for pendulum 1
g = 9.8         # gravity
m = 1           # mass at end of rod
L = 9.8         # length of rod
theta = 0.2     # initial angle (from vertical)
thetaDot = 0    # start pendulum at rest
thetaDotDot = 0 # acceletation
dt = 0.04       # time step
t = 0           # time
Fd = 1.2        # drive force coefficient
Ohm = 2/3       # oscillatory coefficient for drive force
q = 0.5         # coefficient of friction

#pendulum 1 rod
rod = cylinder(pos=pivot, axis = (L*sin(theta),-L*cos(theta),0), radius = 0.1, color=color.cyan)

f=open('JMB312 data 1.txt','w')

g=open('JMB312 data 2.txt','w')

while t < 100000: #a lot of data
    thetaDotDot = -(g / L) * sin(theta) - q * thetaDot + Fd * sin(Ohm * t)
    thetaDot = thetaDot + thetaDotDot * dt
    theta = theta + thetaDot * dt

    time = str(t)
    angle = str(theta)
    angular_velocity = str(thetaDot)

    if t < 750:
        f.write(time)
        f.write(",")
        f.write(angle)
        f.write(",")
        f.write(angular_velocity)
        f.write("\n")

    f1.plot(pos=(theta,thetaDot))

    if -dt**2/4 < Fd * sin(Ohm * t) < dt**2/4: #print poincare section data to separate file        
        g.write(time)
        g.write(",")
        g.write(angle)
        g.write(",")
        g.write(angular_velocity)
        g.write("\n")

        f2.plot(pos=(theta,thetaDot)) 

    if theta > 2 * pi:
        theta = theta - 2 * pi
    if theta < -2 * pi:
        theta = theta + 2 * pi

    rod.axis = (L*sin(theta), -L*cos(theta), 0)

    t = t+dt    
g.close()
f.close()

1 个回答

2

你现在用 g 来存储重力值和打开一个文件。在 g=open('JMB312 data 2.txt', 'w') 这一行,把 g 改成其他名字就可以了,这样应该就能正常工作。

撰写回答