python - 像 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 函数,以便计算获得解析解的值。
解决方案
您收到错误是因为 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)
推荐阅读
- javascript - Javascript 语言环境字符串与 String.prototype.valueOf 的比较
- azure - 远程 terraform 模块的输出变量
- android - 如何在 Android Jetpack Compose 中绘制圆形图像?
- split - 使用 Split 分隔数据字符串
- bash - jq: 递归 -> 嵌套数组
- html - Coldfusion - 是否可以将查询数据导出到 csv 而无需再次查询该函数?
- reactjs - “405 方法不允许”在 aws amplify 中反应 js 应用程序
- azure - 在 Azure DevOps 上开发并部署到另一个云服务
- java - JPA 标准 - 我可以对从数据库日期提取的月份数取模吗?
- c# - C# MySqlException:表不存在 - 数据库名称列出了两次