matlab - 如何从复杂的 Expression Maple/Matlab 构造只有两个变量和一个算术运算的子表达式?
问题描述
让符号表达式如下。
y = s + (a/b)*log((a+c)/(b*a)); %# it can be any type of expression
如何获得所有可能的子表达式,其中包含两个变量和一个运算符。
subExpression1 = b*a;
subExpression2 = a/b;
我在基于运算符提取子表达式时遇到了困难。如果我读了一个运算符,我必须研究它的 LHS 和 RHS 并验证它只对一个变量而不是另一个子表达式进行操作。
有没有办法同时研究操作员的 LHS 和 RHS?
任何意见和建议都会非常有帮助
解决方案
首先,您的表达式中没有子a*b
表达式。在未解析输入的调用中log
,出现一个 subterm c/b*a
。但是在 Maple 的语法中,它被解析为数学上等同于(c*a)/b
and not的东西c/(b*a)
。
但是您的问题包含其他歧义。让我们考虑几个例子:
restart;
expr1 := y = s + (a/b)*log(a+c/b*a);
c a
a ln(a + ---)
b
expr1 := y = s + -------------
b
expr2 := y = s + a*log(a+c/b*a)/b;
c a
a ln(a + ---)
b
expr2 := y = s + -------------
b
expr2 - expr1;
0 = 0
所以expr1
和expr2
在数学上是等价的。Maple 甚至在内部保持着相同的结构。(您可以同时使用lprint
和dismantle
命令来检查。)
因此,在解析 input 之后,您似乎要求在其中任何一个a/b
中被识别,即使该术语在逐字输入中(在解析之前)没有相同地出现。这本身并没有错,但我们需要知道这是您期望的一部分。如果要被识别为该值的候选子压缩,无论是否输入 like或,那么这是一个关键细节。如果这不是您的愿望,那么您真的必须证明在解析后如何区分它们(因为它们可能解析为相同的东西,这取决于 Maple 会话中已经发生的事情!)。a/b
expr1
expr2
另外,你打算如何处理数学上等价的东西(a*s)/(b)
?您是否想要返回所有可能的算术配对的代码,例如。a*s, a/b, s/b
? 或者你想要只是a*s
,或者只是a/b
,或者只是s/b
?
现在考虑另一个例子:
expr3 := a+c*a/b;
c a
expr3 := a + ---
b
normal(expr3);
a (b + c)
---------
b
这些在数学上是等效的,尽管存储方式不同。根据您对可接受的“子表达式”的定义,您可能希望也可能不希望希望a/b
,或c/b
,或b+c
,在您的结果中。
我认为您可能需要解决您想要的问题,至少在上面这三个示例的模棱两可的情况下,您的问题才能得到明智的解决。
推荐阅读
- vue.js - 使用 vue.js 将 24 小时制转换为带 AM 和 PM 的 12 小时制
- c# - 在 ASP.NET Core 应用程序中禁用 Quartz.Net 的调试日志记录
- php - 从 POST 追加后恢复 div 的属性
- postgresql - 2个数据库之间的Postgres中的DBLINK总是给出语法错误
- azure-devops - 在 Azure Devops 中添加新服务挂钩订阅时的 URL
- random - 最近接到一个任务,要求我使用分层随机抽样的方法,选择50个样本记录,覆盖所有圆柱值
- angular - 在 Angular 12 中更改组件的名称
- apache-kafka - 如何防止生产到kafka主题?
- javascript - cropper.js 无法初始化没有显示任何错误
- blockchain - 有交易的测试网吗?我想测试交易我新创建的代币