【问题标题】:Mathematical function, unassigned variables?数学函数,未分配的变量?
【发布时间】:2013-02-03 01:17:16
【问题描述】:

我正在寻找一种在为方程中的变量分配数值之前将多个数学函数相加的方法。
我这样做是因为我需要优化我的代码,并且我想每次都为变量分配不同的值。我正在尝试做的一个例子:

  1. f(x, y) = x + 2y

  2. g(x, y) = 3x - y

  3. 添加f(x, y) + g(x, y)得到h(x, y),所以f(x, y) + g(x, y) = h(x, y) = 4x + y

  4. 现在我有 h(x, y),我需要来自 h(x, y) 的多个值

x = 4; y = 3, h(x, y) = 19
x = 1, y = 0, h(x, y) = 4

等等

这可能吗?我试图将它们创建为字符串,添加字符串,然后删除引号以评估总和,但这不起作用。我正在尝试以这种方式执行我的方法,因为我想优化我的代码。如果我能够在评估它之前创建我的最终函数(在这种情况下是h(x, y)),那将非常有帮助。

编辑:我正在添加 (e ** (x + y)),因此使用矩阵的线性解决方案不起作用:/

【问题讨论】:

  • 您基本上是在寻找解析器。查看PLY - python 的 lex 和 yacc 版本
  • 即使使用 e**(x+y),矩阵解决方案也可能适用于可以适当转换指数的情况。例如e**(x+y) == ex * ey 因此,如果每个项都是向量,则可以将这两个向量相乘,从而提供比我预期的更快的解决方案@ 987654331@可以给。不过,对于没有适当转换的一般情况,@unutbu 的解决方案非常有吸引力。
  • 我将如何使用矩阵来做到这一点?我正在处理可能看起来像...的方程... e^ipi(4x - 2y) + e^ipi(10x + 3y) + e^ipi(x + 24y)...

标签: python function unassigned-variable


【解决方案1】:

SymPy 可以这样做:

import sympy as sym

x, y = sym.symbols('xy')
f = x + 2*y
g = 3*x - y
h = f + g

这说明SymPy已经简化了表达式:

print(h)
# y + 4*x

这显示了如何评估 h 作为 xy 的函数:

print(h.subs(dict(x=4, y=3)))
# 19
print(h.subs(dict(x=1, y=0)))
# 4

【讨论】:

    【解决方案2】:

    如果函数都是变量的线性组合,如示例中所示,则不需要解析器或@unutbu 建议的 sympy 解决方案(这似乎绝对是复杂函数的正确答案)。

    对于线性组合,我会使用numpy 数组来包含变量的系数,如下所示:

    import numpy as np
    f = np.array([1,2])
    g = np.array([3,-1])
    h = f + g
    x = np.array([4,3])
    sum(h*x)
    

    ...给出答案19,如您的示例所示。

    【讨论】:

      【解决方案3】:

      您也可以使用 lambda 函数。

      f=lambda x,y:x+2*y
      g=lambda x,y:3*x-y
      h=lambda x,y:f(x,y)+g(x,y)
      

      并评估h(x,y)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-13
        相关资源
        最近更新 更多