首页 > 解决方案 > 像 de-lambdify 这样的东西

问题描述

假设我有以下 lambda 函数

import numpy as np
f = lambda x,t : np.cos(t)

现在我想获得 f 的符号表达式(最终目标是获得该函数 f 的原语)。所以

import sympy as sym
x_s = sym.Symbol('x')
t_s = sym.Symbol('t')
sym.integrate(f(x_s,t_s), t_s)

但这失败并出现错误:

TypeError: ufunc 循环不支持 Symbol 类型的参数 0,它没有可调用的 cos 方法

我希望能够将任何封闭式表达式转换为 sympy。

谢谢。

编辑:我最终要实现的是使用 Dedalus 对 PDE 进行数值求解。目前我只需要一个具有非常数系数的线性反应扩散方程。该函数 f(x,t) 是系数之一。因为方程是线性的,所以我有解析解,它是一个函数,它依赖于函数 f(x,t) 相对于 t 的原语。所以我想在一个地方输入函数 f(x,t),然后用它来构造数值解(在这种情况下我只需要调用 f(x,t) 和解析解(在这个情况下我需要调用 f(x,t)) 的原语。

所以底线:我需要定义一个 lambda 函数,它依赖于 2 个参数 x 和 t 用于以下目的:

1) 计算给定 x 和 t 的值。2) 将该函数定义转换为用于使用 dedalus 求解数值方程的文本(并将对 sym 的每个引用替换为 np,否则 dedalus 会出错)。3) 能够获得该函数的原语(这就是我使用 sympy 的原因),然后定义该原语的 lambda 函数,以便计算获得解析解的值。

标签: pythonnumpysympy

解决方案


您收到错误是因为 numpy 的 cos 与 sympy.Symbol 不兼容。要摆脱这个错误,你应该像这样重写你的 lambda:

import sympy as sym
f = lambda x,t : sym.cos(t)

De-lambdify 是这样执行的:

x_s = sym.Symbol('x')
t_s = sym.Symbol('t')
sym.integrate(f(x_s,t_s), t_s)

当你调用 f 时,它返回 sympy cos 函数。PS 检查你是否真的需要 f 函数中的 x 参数。因此,完整的代码将是:

import sympy as sym

f = lambda x,t : sym.cos(t)
x_s = sym.Symbol('x')
t_s = sym.Symbol('t')
sym.integrate(f(x_s,t_s), t_s)

推荐阅读