You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将方程作为函数参数传入?实现无预定义变量的方程调用

问题:如何传入未预定义变量的“空白方程”作为函数参数?

我想把一个方程作为函数的参数传入,但不需要预先定义方程里的变量,等传入函数后再对这些变量进行操作,相当于一个“空白方程”。请问这种实现可行吗?

用户提供的初始代码(存在报错问题)

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 17:45:31