Python中如何修改函数内依赖其他全局变量的全局变量?欧拉方法实现问题
问题分析与解决
你的核心问题是把函数表达式直接当成数值传入了Euler函数,而不是传递一个可以接收t和x参数的可调用函数。当你写(-2)*(x-cos(t))-sin(t)时,Python会立刻用全局的x=1和t=1计算出一个固定数值,之后在Euler函数里修改全局t和x根本不会影响这个已经固定的数值,这就是为什么结果始终基于t=x=1。
正确实现方式
不需要使用全局变量,直接让Euler函数接收一个可调用的函数f,在循环中传入当前的t和x计算即可。
修改后的代码
from math import sin, cos def Euler(f, x_0, t_0, T, n): h = (T - t_0) / n x_list = [x_0] t_list = [t_0] for i in range(n): current_t = t_list[i] current_x = x_list[i] # 调用传入的函数f,传入当前的t和x next_x = current_x + h * f(current_t, current_x) x_list.append(next_x) next_t = round(current_t + h, 2) t_list.append(next_t) return t_list, x_list # 定义微分方程的右端函数f(t, x),用lambda或者def都可以 f = lambda t, x: (-2)*(x - cos(t)) - sin(t) # 或者用def定义: # def f(t, x): # return (-2)*(x - cos(t)) - sin(t) sol = Euler(f, 1, 0, 2, 20) print(sol)
关键改动说明
- 传递可调用函数:把原来的表达式换成
lambda t, x: ...(或自定义函数),这样f是一个可以接收t和x参数的函数,而不是固定数值。 - 移除全局变量:在Euler函数内直接使用循环中的
current_t和current_x,调用f(current_t, current_x)计算当前步的导数值,完全不需要全局变量。 - 逻辑清晰化:明确当前步的
t和x,避免变量混淆。
内容的提问来源于stack exchange,提问作者Karol Wyrębkiewicz
相关产品推荐
相关产品推荐

