Python中UnboundLocalError报错修复:局部变量'y'未赋值即引用
错误原因与修复方案
错误根源
你遇到的UnboundLocalError是因为在F4函数的第25行y = (a*x)/(b*y)中,右边的变量y在赋值前从未被定义过。Python在执行这行代码时,找不到y的初始值,因此触发报错。
修复方案
根据你注释里的函数形式F(x; y) = (a · x) / (b · y),分两种场景处理:
场景1:你实际想定义的是显函数(注释中的y为笔误)
如果函数应该是y = (a·x)/b(去掉分母的y),直接修改F4函数:
#F(x; y) = (a · x) / b (修正后的显函数) def F4(a, b): x = np.linspace(-6,9,100) y = (a*x)/b # 移除分母中的y return x, y
调用部分无需修改,直接保留x, y = F4(a, b)即可。
场景2:确实要实现隐函数(a·x)/(b·y)
原函数F(x,y)=(a·x)/(b·y)是一个隐函数(无法直接表示为y=f(x)的单值形式),整理后等价于b·y² = a·x。需要生成正负两支曲线来绘制:
#F(x; y) = (a · x) / (b · y) → 等价于 b·y² = a·x def F4(a, b): x = np.linspace(0.1,9,100) # 避免x=0或负数(因y²非负,a/b=5/1>0,故x需≥0) y_pos = np.sqrt((a*x)/b) # 正半支 y_neg = -np.sqrt((a*x)/b) # 负半支 return x, y_pos, y_neg
同时修改调用和绘图代码:
x, y_pos, y_neg = F4(a, b) plt.plot(x, y_pos, label="F4(x,y): (a · x) / (b · y) (正支)") plt.plot(x, y_neg, label="F4(x,y): (a · x) / (b · y) (负支)")
完整修复后的代码示例(场景2)
import matplotlib.pyplot as plt import numpy as np #F(x;y) = a · x + b · y def F1(a, b): x = np.linspace(-6,9,100) y = a*x + b return x, y #F(x; y) = a · x - b · y def F2(a, b): x = np.linspace(-6,9,100) y = a*x - b return x, y #F(x; y) = a · x · b · y def F3(a, b): x = np.linspace(-6,9,100) y = a*x*b return x, y #F(x; y) = (a · x) / (b · y) → 等价于 b·y² = a·x def F4(a, b): x = np.linspace(0.1,9,100) y_pos = np.sqrt((a*x)/b) y_neg = -np.sqrt((a*x)/b) return x, y_pos, y_neg plt.title("Euler's method") plt.xlabel("x") plt.ylabel("y") a = 5 b = 1 x, y = F1(a, b) plt.plot(x, y, label="F1(x,y): a · x + b · y") x, y = F2(a, b) plt.plot(x, y, label="F2(x,y): a · x - b · y") x, y = F3(a, b) plt.plot(x, y, label="F3(x,y): a · x · b · y") x, y_pos, y_neg = F4(a, b) plt.plot(x, y_pos, label="F4(x,y): (a · x) / (b · y) (正支)") plt.plot(x, y_neg, label="F4(x,y): (a · x) / (b · y) (负支)") plt.legend() plt.show()
内容的提问来源于stack exchange,提问作者Magdalena
相关产品推荐
相关产品推荐

