mathematica中如何比较两个表达式的大小

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mathematica中如何比较两个表达式的大小相关的知识,希望对你有一定的参考价值。

我刚接触mathematica呀,求出一个很复杂的符号表达式,想知道表达式是否大于零,怎么做呀,谢谢啊

同学,这种的不一定的,你问这种问题最好把式子附上,多贴几行语句又不会少块肉……如果是显式的符号表达式的话,那么一般使用FullSimplify在一定条件下进行化简可以达到目的,一个简单的例子:
FullSimplify[Exp[x] > 0, x \[Element] Reals]

(*True*)
对于更复杂的情形,比如一些插值函数式,以上方法会失效,这种时候一个可行的(同时它也适用于上面的情形)方法是用MinValue,一个简单的例子:
MinValue[x^2 + 1, x] >= 0

(*True*)
参考技术A 你想的太理想化了。
好多软件都是很“笨”的,只能你自己去分类讨论。
祝好!
参考技术B 先把语文和数学学好吧,孩纸,等你学会描述清楚你遇到的问题了,再来问这个问题吧。

如何比较 SQL where 条件中的两个逻辑表达式? [关闭]

【中文标题】如何比较 SQL where 条件中的两个逻辑表达式? [关闭]【英文标题】:How to compare two logical expressions from SQL where condition? [closed] 【发布时间】:2016-10-03 03:03:30 【问题描述】:

我想要两个比较两个 SQL where 子句来检查条件是否相似。

在以下示例中,SQL 查询在 where 子句中具有相同的逻辑条件。什么操作会告诉我两个 where 子句条件在逻辑上是相同的?

是否有一个正则表达式?还有其他方法吗?

String Q3 = "select t1.ID as ID,t1.FIELD8 as I_RECHARGE_TYPE,t1.FIELD28 as I_RECHARGE_AMOUNT,t1.FIELD1 as I_ACTIVATION_DATE,t1.FIELD2 as I_MSISDN from INSTANT_CDR_0 as t1 where t1.FIELD2 = ? and ((((t1.FIELD8 IS NOT NULL  AND  t1.FIELD28 > 0) OR  DATE_FORMAT(t1.FIELD1,'%Y-%m-%d') > '2016-05-21')) or ((DATE_FORMAT(t1.FIELD1,'%Y-%m-%d') < '2015-12-03' OR ( t1.FIELD28 > 0 AND  t1.FIELD28 < 101))))";
String Q4 = "select t1.ID as ID,t1.FIELD1 as I_ACTIVATION_DATE,t1.FIELD8 as I_RECHARGE_TYPE,t1.FIELD28 as I_RECHARGE_AMOUNT,t1.FIELD2 as I_MSISDN from INSTANT_CDR_0 as t1 where t1.FIELD2 = ? and (((DATE_FORMAT(t1.FIELD1,'%Y-%m-%d') > '2016-05-21' OR ( t1.FIELD8 IS NOT NULL  AND  t1.FIELD28 > 0))) or (((t1.FIELD28 > 0 AND  t1.FIELD28 < 101) OR  DATE_FORMAT(t1.FIELD1,'%Y-%m-%d') < '2015-12-03')))"; 

如何比较 ((a=2) and (b=3))((b=3) and(a=2)) 并找出它们相同?

【问题讨论】:

你想如何比较它们?按字典顺序? 基于逻辑意义 请提供预期的输出?你想要的测试条件? 你必须实现 SQL 词法分析器、解析器和解释器来解决你的任务:) 提示:切勿将更多信息放入 cmets。而是更新您的问题。你希望人们尽可能轻松地提供帮助;不强迫他们通读所有 cmets。 【参考方案1】:

如果您拥有的所有字段都是布尔值,则更简单的情况是。所以所有的逻辑表达式也都是布尔表达式。

然后您将面临的问题是尝试找出两个布尔表达式是否等价 - 也就是说,对于每个可能的输入,它们都提供相同的答案。

执行此操作的一种方法可能是:让A 成为第一个表达式,B 成为第二个表达式,A and B 是两者的逻辑和。要使两个表达式等效,应用于所有可能输入的A and B 必须为真。这意味着 not (A and B) 对于所有输入都必须为 false。因此,最后一个问题变成了Boolean satisfiability problem。这个问题询问,对于一个布尔表达式,是否存在至少一个使其为真的输入分配。如果有,那么你可以说这两个表达式使用我们的构造不等价,否则你说他们等价

好消息是有大量用于解决问题的工具,称为 SAT 求解器,用于大量工业应用(例如电路设计)。

坏消息是问题出在NP-complete。所以这是一个真的很难。如果问题的设置不适合 SAT 求解器使用的通常启发式算法,那么您将不得不等待一段时间才能得到结果(也许要等到宇宙的热寂?)。

更糟糕的消息是 SAT 求解器专注于布尔问题,而您有 SQL 数据类型,这是更普遍的问题。不幸的是,开发用于解决问题的工具。

正如其他人所提到的,所有这些都需要解析表达式。

根据您希望结果的精确程度,您可以执行以下技巧:运行两个查询。如果它们提供相同的结果,则说表达式是等价的。如果不是,就说他们不是。你在这里遇到的情况是你可以有误报,但没有误报。所以,如果你说两个表达式不等价,那么这是一个事实,你不能否认,否则它们会提供相同的答案。但是,如果您说它们是等效的,那么它们实际上可能不是等效的,并且您对自己的数据很幸运。如果人们将来在表格中添加更多数据,则两者将不相等。这里涉及到一些数学问题,我不会在这个答案中勾勒出来,但是,如果有人对输入表/表做出一些假设,并且表中也有足够的行,那么误报的概率,即是,你说两个表达式是等价的,而实际上它们不是,下降得相当低 - 指数如此。所以如果你有 1000 行来测试这些东西,你可以很确定匹配是好的。

您还可以对表达式进行代数运算,试图将一个表达式变为另一个表达式。从布尔表达式(DeMorgan 规则、关联性、卡诺图等)中可以应用一整套它们,这可能有助于找到精确的解决方案,尤其是在 where 子句很简单的情况下,但这对我来说似乎更脆弱。

希望这会有所帮助。确保对查询结果进行排序,以免丢弃真正的匹配项。

【讨论】:

【参考方案2】:

简单/简化的方法可能不够好(最初我没有看到您关于逻辑检查的评论)。正如其他人指出的那样,没有松弛,这个问题是 NP-Complete...

使用JSQLParser 之类的东西来获取结构化表示,然后遍历对象模型并尝试在条件之间进行比较。我会尝试制作一个比较两个表达式并检查是否相等的函数。如果表达式具有深度嵌套/括号,则可以递归调用此函数。

尝试使用正则表达式将 where 子句拆分为条件,然后进行比较。在这里,您必须小心使用 OR/AND 和括号...理想情况下,您最终会希望得到一些保留括号含义的层次结构。

我倾向于认为第一种方法会更容易,因为您不必根据括号等对条件进行中断/分组来打破你的脖子。

【讨论】:

以上是关于mathematica中如何比较两个表达式的大小的主要内容,如果未能解决你的问题,请参考以下文章

mathematica中如何曲线拟合

mathematica如何设置数字的大小,要全局设置

如何有效地计算mathematica中的递归关系?

js中如何比较两个时间大小

Mathematica是编程语言吗

CDateTimeCtrl类型的日期如何比较大小