鱼C论坛

 找回密码
 立即注册
查看: 277|回复: 3

l4为什么未定义

[复制链接]
发表于 2024-5-19 23:09:00 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
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, [w, x, y, z])
    #判断符合实际的解
    if displacement_quation[0][3]>= 0:
        angle2.append(math.acos(displacement_quation[0][0]))
        angle3.append(math.acos(displacement_quation[0][1]))
    else:
        angle2.append(math.acos(displacement_quation[1][0]))
        angle3.append(math.acos(displacement_quation[1][1]))

#角速度
speed_angle1 = 1 #rad/s
speed_angle2 = []
speed_angle3 = []
for i in range(len(angle1)):
    constant2_s = L2*math.sin(angle2[i])
    constant3_s = L3*math.sin(angle3[i])
    constant1_s = L1*math.sin(math.radians(angle1[i]))*speed_angle1
    constant2_c = L2*math.cos(angle2[i])
    constant3_c = L3*math.cos(angle3[i])
    constant1_c = L1*math.cos(math.radians(angle1[i]))*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, [x, y])
    speed_angle2 .append(speed_quation[x])
    speed_angle3 .append(speed_quation[y])


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




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[0], 5*math.degrees(angle2[0]))
t.color('blue')
t.width(2)
t.pendown()
for i in range(len(angle1)):
    t.goto(5*angle1[i],5*math.degrees(angle2[i]))
t.penup()
t.goto(5*angle1[0], 5*math.degrees(speed_angle2[0]))

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


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


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

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


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


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

t.mainloop()


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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 = [Eq(w, constant_s), Eq(x, constant_c), Eq(y, L2*math.sin(z)), Eq(z, L3*math.sin(90-z))]
    displacement_quation = solve(eqs, (z))[0]
    # 判断符合实际的解
    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[i])
    constant3_s = L3 * math.sin(angle3[i])
    constant1_s = L1 * math.sin(math.radians(angle1[i])) * speed_angle1
    constant2_c = L2 * math.cos(angle2[i])
    constant3_c = L3 * math.cos(angle3[i])
    constant1_c = L1 * math.cos(math.radians(angle1[i])) * speed_angle1
    x, y = symbols('x y')
    eqs = [Eq(x, constant1_s - constant2_s), Eq(y, constant2_s - constant3_s)]
    speed_quation = solve(eqs, (x, y))
    speed_angle2.append(speed_quation[x])
    speed_angle3.append(speed_quation[y])

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

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[0], 5 * math.degrees(angle2[0]))
t.color('blue')
t.width(2)
t.pendown()
for i in range(len(angle1)):
    t.goto(5 * angle1[i], 5 * math.degrees(angle2[i]))

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

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

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

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

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

t.mainloop()

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

解决 ...

如何把全局变量应用到其他函数中
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-23 05:03

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表