如何将方程作为函数参数传入?实现无预定义变量的方程调用
问题:如何传入未预定义变量的“空白方程”作为函数参数?
我想把一个方程作为函数的参数传入,但不需要预先定义方程里的变量,等传入函数后再对这些变量进行操作,相当于一个“空白方程”。请问这种实现可行吗?
用户提供的初始代码(存在报错问题)
y = 79.94 + 0.99*var_1 + 0.52*var_2 -1.38*(var_1**2) -1*(var_2**2) + 0.25*var_1*var_2 def ctr_plt(y, x_min= -1, x_max= 1, x_pnts= 25, y_min= -1, y_max= 1, y_pnts= 25, plt1_lvl= 100, plt2_lvl= 5, fig_= 0): x1 = np.linspace(x_min, x_max, x_pnts) y1 = np.linspace(y_min, y_max, y_pnts) var_1, var_2 = np.meshgrid(x1,y1) fig = plt.figure(figsize=(10,6)) y = fun(var_1,var_2) plt.subplot(1,2,1) cntr_plt =plt.contourf(var_1,var_2, y, plt1_lvl, cmap='rainbow') if fig_ > 0: plt.subplot(1,2,2) cntr_plt = plt.contour(var_1,var_2,y,plt2_lvl)#,colors='black', linestyles='dashed') cntr_plt =plt.contourf(var_1,var_2,y,plt2_lvl, cmap='rainbow') #plt.colorbar() plt.clabel(cntr_plt, inline=1, fontsize=12, colors='black')
问题分析
原代码直接定义y的表达式时,var_1和var_2还未定义,运行到这一行就会触发NameError,无法直接作为参数传入函数。必须通过包装方程为可调用对象或延迟计算的方式实现需求。
可行的实现方式
方法1:用Lambda表达式包装方程(推荐)
把方程写成接受var_1和var_2作为参数的lambda函数,传入目标函数后,在函数内调用该lambda计算结果。
修改后完整代码:
import numpy as np import matplotlib.pyplot as plt # 定义“空白方程”:lambda函数,等待传入变量后计算 y_func = lambda var_1, var_2: 79.94 + 0.99*var_1 + 0.52*var_2 -1.38*(var_1**2) -1*(var_2**2) + 0.25*var_1*var_2 def ctr_plt(fun, x_min= -1, x_max= 1, x_pnts= 25, y_min= -1, y_max= 1, y_pnts= 25, plt1_lvl= 100, plt2_lvl= 5, fig_= 0): x1 = np.linspace(x_min, x_max, x_pnts) y1 = np.linspace(y_min, y_max, y_pnts) var_1, var_2 = np.meshgrid(x1,y1) fig = plt.figure(figsize=(10,6)) # 调用传入的lambda函数,用已定义的var_1、var_2计算y y = fun(var_1, var_2) plt.subplot(1,2,1) cntr_plt = plt.contourf(var_1, var_2, y, plt1_lvl, cmap='rainbow') if fig_ > 0: plt.subplot(1,2,2) cntr_plt = plt.contour(var_1, var_2, y, plt2_lvl) cntr_plt = plt.contourf(var_1, var_2, y, plt2_lvl, cmap='rainbow') plt.clabel(cntr_plt, inline=1, fontsize=12, colors='black') plt.tight_layout() plt.show() # 调用函数,传入包装好的方程 ctr_plt(y_func, fig_=1)
方法2:传入方程字符串结合eval(仅可信环境使用)
如果需要用字符串形式传入方程,可以在函数内部用eval执行计算,但eval存在安全风险,仅在你能完全控制输入内容的场景下使用。
示例代码:
import numpy as np import matplotlib.pyplot as plt # 方程字符串,变量名与函数内定义的保持一致 y_str = "79.94 + 0.99*var_1 + 0.52*var_2 -1.38*(var_1**2) -1*(var_2**2) + 0.25*var_1*var_2" def ctr_plt(equation_str, x_min= -1, x_max= 1, x_pnts= 25, y_min= -1, y_max= 1, y_pnts= 25, plt1_lvl= 100, plt2_lvl= 5, fig_= 0): x1 = np.linspace(x_min, x_max, x_pnts) y1 = np.linspace(y_min, y_max, y_pnts) var_1, var_2 = np.meshgrid(x1,y1) fig = plt.figure(figsize=(10,6)) # 延迟执行方程计算,此时var_1、var_2已定义 y = eval(equation_str) plt.subplot(1,2,1) cntr_plt = plt.contourf(var_1, var_2, y, plt1_lvl, cmap='rainbow') if fig_ > 0: plt.subplot(1,2,2) cntr_plt = plt.contour(var_1, var_2, y, plt2_lvl) cntr_plt = plt.contourf(var_1, var_2, y, plt2_lvl, cmap='rainbow') plt.clabel(cntr_plt, inline=1, fontsize=12, colors='black') plt.tight_layout() plt.show() # 调用函数,传入方程字符串 ctr_plt(y_str, fig_=1)
内容的提问来源于stack exchange,提问作者hghebrem
相关产品推荐
相关产品推荐

