如何在Python中向fsolve正确传递元组作为输入变量避免NameError
问题分析与解决
你的代码报错NameError: name 'myvar' is not defined,核心原因是函数f_nb的作用域内没有定义myvar变量,同时存在几个冗余/错误的写法:
vss = ('myvar')定义的是字符串而非元组(元组需要加逗号:('myvar',)),且这个变量在代码中完全没用,可以直接删除。f_nb函数声明了可变参数*vss,但既没有使用该参数,也没有在函数内部定义myvar,导致引用未定义的变量。tryit函数里的myvar是局部变量,无法被f_nb访问,必须通过参数传递的方式把值传给f_nb。
修正后的代码
简化版(直接使用目标函数)
from scipy.optimize import fsolve def f_nb(myvar): return 0.8 - myvar # fsolve直接传入目标函数和初始猜测值 solz = fsolve(f_nb, 0.2) print(solz) # 输出: [0.8]
保留原函数结构的修正版
如果你想保留tryit的结构,只需确保f_nb正确接收参数:
from scipy.optimize import fsolve def f_nb(myvar): nb = 0.8 - myvar return nb def tryit(xx): zz = f_nb(xx) return zz solz = fsolve(tryit, 0.2) print(solz)
关键说明
- 函数间的变量传递必须通过参数实现,不能直接引用其他函数的局部变量。
fsolve要求目标函数接收一个参数(待求解的变量),并返回该变量对应的函数值,当函数值为0时,对应的变量就是解。
内容的提问来源于stack exchange,提问作者night_owl89
相关产品推荐
相关产品推荐

