江一a 发表于 2024-5-19 23:09:00

l4为什么未定义

from sympy import symbols, Eq, solve, nsolve
import math
import turtle as t
import tkinter as tk

def on_submit_button_click():
    global L1, L2, L3, L4, speed_angle1# 声明变量是全局变量

    L1 = int(L1_entry.get())
    L2 = int(L2_entry.get())
    L3 = int(L3_entry.get())
    L4 = int(L4_entry.get())
    speed_angle1= int(speed_angle1_entry.get())






root = tk.Tk()
root.title("变量赋值界面")

# 创建Entry控件和标签
labels = ['L1', 'L2', 'L3', 'L4', 'speed_angle1 ']
entries = []
for label in labels:
    tk.Label(root, text=label + ":").pack()
    entry = tk.Entry(root)
    entry.pack()
    entries.append(entry)

L1_entry, L2_entry, L3_entry, L4_entry, speed_angle1_entry = entries

submit_button = tk.Button(root, text="提交", command=on_submit_button_click)
submit_button.pack()


# 开始Tkinter事件循环
root.mainloop()


#L1,L2,L3,L4 = 26.5,111.6,67.5,87.5

#角位移
angle1 = []
angle2 = []
angle3 = []
for i in range(120):#每3度求解存储数据
    angle1.append(i*3)
for constant in angle1:
    #解非线性方程,求解角位移
    constant_c = L4-L1*math.cos(math.radians(constant))
    constant_s = -L1*math.sin(math.radians(constant))
    w, x, y, z = symbols('w x y z ')
    eqs = [Eq(L2*w - L3*x, constant_c),
         Eq(L2*y - L3*z, constant_s),
         Eq(w**2 + y**2,1),
         Eq(x**2 + z**2,1)]
    displacement_quation = solve(eqs, )
    #判断符合实际的解
    if displacement_quation>= 0:
      angle2.append(math.acos(displacement_quation))
      angle3.append(math.acos(displacement_quation))
    else:
      angle2.append(math.acos(displacement_quation))
      angle3.append(math.acos(displacement_quation))

#角速度
speed_angle1 = 1 #rad/s
speed_angle2 = []
speed_angle3 = []
for i in range(len(angle1)):
    constant2_s = L2*math.sin(angle2)
    constant3_s = L3*math.sin(angle3)
    constant1_s = L1*math.sin(math.radians(angle1))*speed_angle1
    constant2_c = L2*math.cos(angle2)
    constant3_c = L3*math.cos(angle3)
    constant1_c = L1*math.cos(math.radians(angle1))*speed_angle1
    x, y = symbols('x y')
    eqs = [Eq(-constant2_s*x + constant3_s*y, constant1_s),
         Eq(constant2_c*x - constant3_c*y, -constant1_c)]
    speed_quation = solve(eqs, )
    speed_angle2 .append(speed_quation)
    speed_angle3 .append(speed_quation)


#角加速度
acceleration_angle1 = 0
acceleration_angle2 = []
acceleration_angle3 = []
for i in range(len(angle1)):
    constant2_s = L2*math.sin(angle2)
    constant3_s = L3*math.sin(angle3)
    constant1_s = L1*math.sin(math.radians(angle1))
    constant2_c = L2*math.cos(angle2)
    constant3_c = L3*math.cos(angle3)
    constant1_c = L1*math.cos(math.radians(angle1))
    constant_s = constant2_s*speed_angle2**2 - constant3_s*speed_angle3**2 + constant1_s
    constant_c = constant2_c*speed_angle2**2 - constant3_c*speed_angle3**2 + constant1_c
    x, y = symbols('x y')
    eqs = [Eq(-constant2_s*x + constant3_s*y,constant_c),
         Eq(constant2_c*x - constant3_c*y,constant_s)]
    acceleration_quation = solve(eqs, )
    acceleration_angle2 .append(acceleration_quation)
    acceleration_angle3 .append(acceleration_quation)




t.hideturtle()
t.speed("fastest")
# 直角坐标系
t.color('red')
t.penup()
t.goto(-500, 0)
t.pendown()
t.goto(500, 0)
t.penup()
t.goto(0, -500)
t.pendown()
t.goto(0, 500)

t.penup()
t.goto(5*angle1, 5*math.degrees(angle2))
t.color('blue')
t.width(2)
t.pendown()
for i in range(len(angle1)):
    t.goto(5*angle1,5*math.degrees(angle2))
t.penup()
t.goto(5*angle1, 5*math.degrees(speed_angle2))

t.color('blue')
t.width(3)
t.pendown()
for i in range(len(angle1)):
    t.goto(5*angle1, 5*math.degrees(speed_angle2))
t.penup()
t.goto(5*angle1,5*math.degrees(acceleration_angle2))


t.color('blue')
t.width(4)
t.pendown()
for i in range(len(angle1)):
    t.goto(angle1, math.degrees(acceleration_angle2))
t.penup()
t.goto(5*angle1, 5*math.degrees(angle3))


t.color('yellow')
t.width(2)
t.pendown()

for i in range(len(angle1)):
    t.goto(5*angle1,5*math.degrees(angle3))
t.penup()
t.goto(5 * angle1, 5 * math.degrees(speed_angle3))


t.color('yellow')
t.width(3)
t.pendown()
for i in range(len(angle1)):
    t.goto(angle1, math.degrees(speed_angle3))
t.penup()
t.goto(5*angle1,5* math.degrees(acceleration_angle3))


t.color('yellow')
t.width(4)
t.pendown()
for i in range(len(angle1)):
    t.goto(5 * angle1, 5 * math.degrees(acceleration_angle3))

t.mainloop()


FishC 发表于 2024-5-19 23:09:25

变量L4未定义是因为你在全局变量声明中没有给L4赋值,导致在后续使用L4的地方会出现未定义的错误。

解决方法是在全局变量声明中给L4一个初始值,例如L4 = 0。或者在用户输入之后,添加一个判断语句,如果用户没有输入L4,则给L4一个默认值。

另外,你在计算角位移、角速度和角加速度的代码中有一些问题。我将为你提供修改后的代码:

from sympy import symbols, Eq, solve
import math
import turtle as t
import tkinter as tk

def on_submit_button_click():
    global L1, L2, L3, L4, speed_angle1# 声明变量是全局变量

    L1 = int(L1_entry.get())
    L2 = int(L2_entry.get())
    L3 = int(L3_entry.get())
    L4 = int(L4_entry.get())
    speed_angle1 = int(speed_angle1_entry.get())

root = tk.Tk()
root.title("变量赋值界面")

# 创建Entry控件和标签
labels = ["L1", "L2", "L3", "L4", "速度角度1"]
entries = []
for label in labels:
    tk.Label(root, text=label + ":").pack()
    entry = tk.Entry(root)
    entry.pack()
    entries.append(entry)

L1_entry, L2_entry, L3_entry, L4_entry, speed_angle1_entry = entries

submit_button = tk.Button(root, text="提交", command=on_submit_button_click)
submit_button.pack()

# 开始Tkinter事件循环
root.mainloop()

angle1 = [] # 角位移
angle2 = []
angle3 = []
for i in range(120): # 每3度求解存储数据
    angle1.append(i * 3)
for constant in angle1:
    # 解非线性方程,求解角位移
    constant_c = L4 - L1 * math.cos(math.radians(constant))
    constant_s = -L1 * math.sin(math.radians(constant))
    w, x, y, z = symbols('w x y z ')
    eqs =
    displacement_quation = solve(eqs, (z))
    # 判断符合实际的解
    if displacement_quation >= 0:
      angle2.append(math.acos(displacement_quation))
      angle3.append(math.acos(displacement_quation))
    else:
      angle2.append(math.acos(displacement_quation))
      angle3.append(math.acos(displacement_quation))

speed_angle2 = [] # 角速度
speed_angle3 = []
for i in range(len(angle1)):
    constant2_s = L2 * math.sin(angle2)
    constant3_s = L3 * math.sin(angle3)
    constant1_s = L1 * math.sin(math.radians(angle1)) * speed_angle1
    constant2_c = L2 * math.cos(angle2)
    constant3_c = L3 * math.cos(angle3)
    constant1_c = L1 * math.cos(math.radians(angle1)) * speed_angle1
    x, y = symbols('x y')
    eqs =
    speed_quation = solve(eqs, (x, y))
    speed_angle2.append(speed_quation)
    speed_angle3.append(speed_quation)

acceleration_angle2 = [] # 角加速度
acceleration_angle3 = []
for i in range(len(angle1)):
    constant2_s = L2 * math.sin(angle2)
    constant3_s = L3 * math.sin(angle3)
    constant1_s = L1 * math.sin(math.radians(angle1))
    constant2_c = L2 * math.cos(angle2)
    constant3_c = L3 * math.cos(angle3)
    constant1_c = L1 * math.cos(math.radians(angle1))
    constant_s = constant2_s * speed_angle2 ** 2 - constant3_s * speed_angle3 ** 2 + constant1_s
    constant_c = constant2_c * speed_angle2 ** 2 - constant3_c * speed_angle3 ** 2 + constant1_c
    x, y = symbols('x y')
    eqs =
    acceleration_quation = solve(eqs, (x, y))
    acceleration_angle2.append(acceleration_quation)
    acceleration_angle3.append(acceleration_quation)

t.hideturtle()
t.speed("fastest")
# 直角坐标系
t.color('red')
t.penup()
t.goto(-500, 0)
t.pendown()
t.goto(500, 0)
t.penup()
t.goto(0, -500)
t.pendown()
t.goto(0, 500)

t.penup()
t.goto(5 * angle1, 5 * math.degrees(angle2))
t.color('blue')
t.width(2)
t.pendown()
for i in range(len(angle1)):
    t.goto(5 * angle1, 5 * math.degrees(angle2))

t.penup()
t.goto(5 * angle1, 5 * math.degrees(speed_angle2))
t.color('blue')
t.width(3)
t.pendown()
for i in range(len(angle1)):
    t.goto(5 * angle1, 5 * math.degrees(speed_angle2))

t.penup()
t.goto(5 * angle1, 5 * math.degrees(acceleration_angle2))
t.color('blue')
t.width(4)
t.pendown()
for i in range(len(angle1)):
    t.goto(5 * angle1, 5 * math.degrees(acceleration_angle2))

t.penup()
t.goto(5 * angle1, 5 * math.degrees(angle3))
t.color('yellow')
t.width(2)
t.pendown()
for i in range(len(angle1)):
    t.goto(5 * angle1, 5 * math.degrees(angle3))

t.penup()
t.goto(5 * angle1, 5 * math.degrees(speed_angle3))
t.color('yellow')
t.width(3)
t.pendown()
for i in range(len(angle1)):
    t.goto(5 * angle1, 5 * math.degrees(speed_angle3))

t.penup()
t.goto(5 * angle1, 5 * math.degrees(acceleration_angle3))
t.color('yellow')
t.width(4)
t.pendown()
for i in range(len(angle1)):
    t.goto(5 * angle1, 5 * math.degrees(acceleration_angle3))

t.mainloop()

这样就能够定义并使用L4变量,并且修复了其他的一些错误,让程序可以正确运行。希望能对你有所帮助!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

江一a 发表于 2024-5-19 23:16:32

FishC 发表于 2024-5-19 23:09
变量L4未定义是因为你在全局变量声明中没有给L4赋值,导致在后续使用L4的地方会出现未定义的错误。

解决 ...

如何把全局变量应用到其他函数中

FishC 发表于 2024-5-19 23:16:47

江一a 发表于 2024-05-19 23:16
如何把全局变量应用到其他函数中

在Python中,你可以通过函数参数或者返回值来将全局变量应用到其他函数中。以下是两种常见的方法:

1. **函数参数**:
   如果你想在函数内部使用全局变量,可以直接将它们作为参数传递进去。这样,函数内部就可以访问到这些全局变量,而不会改变它们的原始值。

   def func_global_var(var_name):
       global L1# 声明为全局变量
       # 在函数内部使用 L1
       result = L1 * 2# L1的值会被函数使用
       return result# 可以选择返回使用后的值

   # 在主程序中使用
   L1_value = 10
   result = func_global_var(L1_value)
   print(result)# 输出:20

2. **返回值**:
   如果你想在函数内部修改全局变量,但不希望改变它的原始值,可以将修改后的值作为返回值。这样,外部可以调用这个函数,然后使用返回值来更新全局变量。

   def modify_global(var_name):
       global L1# 声明为全局变量
       L1 += 5# 修改全局变量
       return L1# 返回修改后的值

   # 在主程序中使用
   L1 = 10
   L1 = modify_global(L1)# L1的值会被更新
   print(L1)# 输出:15

3. **使用`nonlocal`**:
   如果你不想改变全局变量,但希望在函数内部使用它,可以使用`nonlocal`关键字声明。这样,函数内部可以声明一个局部变量,但这个变量实际上指向的是全局变量。

   def use_global(var_name):
       nonlocal L1# 声明为非局部变量
       L1 = L1 + 1# 使用非局部的 L1
       print(L1)# 输出:11

   L1 = 10
   use_global(L1)# L1的值会被更新,但外部不会改变
   print(L1)# 输出:10

记住,使用全局变量时要谨慎,因为它们可能会影响代码的可读性和维护性。如果可能,尽量避免全局变量,而是使用局部变量或者类的属性。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页: [1]
查看完整版本: l4为什么未定义