如何使用mathematica判定含有变量的不等式的真假?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用mathematica判定含有变量的不等式的真假?相关的知识,希望对你有一定的参考价值。
如题,举例来说: yan[x_] = x^2; TrueQ[yan[x] > -1] yan[x] > -1 这个不等式按理来说应该是在全定义域上都是真的,可是TrueQ无法返回True,因为它只当它是个符号式,所以没法正确判断。对于这个情况应该怎么解决?这里举的例子是比较简单,但是,如果不等式里含的式子十分复杂,以致于不知道它的解析式时呢?比如插值函数InterpolatingFunction之类的? 实际上我面对的是一个含插值函数的不等式: yan = FunctionInterpolation[Sin[x], x, -Pi, Pi] FullSimplify[yan[x] > -1, 0 < x < 1] 我所期待的当然是得出一个True的输出——实际上这个不等式是用来做个循环的条件的。 ------------------------------- 我找到解法了,使用MinValue就可以了。不过还是要谢谢yang_bigarm。
参考技术A 在一个表达式被计算之前,它无法知道这个表达式的值,这个是计算机本身的限制。mathematica可以计算复数域的值,所以你这个不等式并不是在整个定义域上都是真的。解不等式可以试试Reduce函数
Reduce[x^2
>
-1]
如果你要断言它在整个实数域上为真,那么可以这么写:
SameQ[Reduce[x^2
>
-1],
x
\[Element]
Reals]
Mathematica 中的递归限制错误
【中文标题】Mathematica 中的递归限制错误【英文标题】:Recursion Limit Errors in Mathematica 【发布时间】:2013-08-05 08:06:01 【问题描述】:我正在使用 Mathematica 9 Student Edition,但遇到递归限制错误问题。我编写了一个有效的程序并涉及数值积分。如果我自己运行这个过程并插入我想要测试的值,那么这个过程就可以正常工作。该过程打印在下面。对于任何感兴趣的人,它应该将两个随机变量 betaone 和 betazero 转换为另外两个随机变量 gamma 和 rho,然后使用这些新的随机变量对概率密度函数进行数值积分:
xtheta = .4; xx = .1;
c = 1/theta /. theta -> xtheta;
gamma = (Log[theta / (1 - theta)] - betazero - x*betaone) /
betaone;
rho = Exp[ betazero + x*betaone] / (1 +
Exp[betazero + x*betaone]);
JMatrix = D[gamma, betazero],
D[gamma, betaone], D[rho, betazero], D[rho, betaone];
myJacobian = Det[JMatrix] ; gamma =.; rho =.;
betazero = (1/
gamma)*((x + gamma)*Log[rho/(1 - rho)] - x*Log[theta/(1 - theta)]);
betaone = (1/gamma)*(Log[theta/(1 - theta)] - Log[rho/(1 - rho)]);
finalPDF =
c * myJacobian /. betazero -> (1/
gamma)*((x + gamma)*Log[rho/(1 - rho)] -
x*Log[theta/(1 - theta)]),
betaone -> (1/gamma)*(Log[theta/(1 - theta)] -
Log[rho/(1 - rho)]);
theta = xtheta; finalPDF2 = finalPDF /. x -> xx;
n = NIntegrate[finalPDF2, rho, 0, xtheta - .001, gamma, 0, 1];
但是,只要我在此过程之后添加 Print[n] 语句,代码就无法运行,并且我收到以下错误“$RecursionLimit::reclim: Recursion depth of 1024 exceeded”。谁能解释我为什么会收到此错误以及如何解决它?
另外,我希望在一个循环中使用这个过程,这样我就可以一遍又一遍地运行这个过程,稍微改变一个变量,然后使用 Print 语句输出我的结果。我曾尝试使用 Do 循环和 For 循环,但我遇到了与以前相同的问题,即“$RecursionLimit::reclim: Recursion depth of 1024 exceeded”错误消息。有谁知道使用一个循环是否比另一个循环更有优势,以及循环的问题是否与我的 Print 语句问题相同?
感谢您的帮助!
【问题讨论】:
你分配了 betazero/one 然后将它们用作模式替换 后续,代码在第一次通过时运行良好,当您重新运行它时会出现错误结果,因为 betazero,betaone 现在已定义,并且您正在对那些复杂的表达式进行衍生。只需消除分配即可修复它(或在顶部清除它们) 现在有一个专门用于 Mathematica 的 StackExchange 站点:mathematica.stackexchange.com -- 请在那里提出您未来的问题。 【参考方案1】:为了 os 提供答案,这里是您的代码的清理版本。 请注意,我们避免分配给我们想要用作积分/导数符号的东西。
f[xtheta_, xx_] :=
Module[theta, gamma, rho, betazero, betaone, x, sub, myJacobian,
JMatrix, finalPDF,
sub =
gamma -> (Log[theta/(1 - theta)] - betazero - x*betaone)/betaone,
rho -> Exp[betazero + x*betaone]/(1 + Exp[betazero + x*betaone]);
JMatrix =
D[gamma /. sub, betazero], D[gamma /. sub, betaone],
D[rho /. sub, betazero],D[rho /. sub, betaone] ;
myJacobian = Det[JMatrix];
finalPDF = myJacobian/theta /.
theta -> xtheta,
betazero -> (1/gamma)*((x + gamma)*Log[rho/(1 - rho)] -
x*Log[theta/(1 - theta)]),
betaone -> (1/gamma)*(Log[theta/(1 - theta)] -
Log[rho/(1 - rho)]);
NIntegrate[finalPDF /. x -> xx, theta -> xtheta,
rho, 0, xtheta - .001,
gamma, 0, 1]];
n = f[.4, .1]
(* 0.247738 *)
模块结构使这个循环“安全”,即。保证从一个传递到下一个传递没有意外的副作用:
Table[f[p, q], p, .2, .4, .6, q, .1, .2]
(0.17888, 0.17888, 0.247738, 0.247738, 0.197697, 0.197697)
【讨论】:
谢谢乔治!你真的竭尽全力解决我的问题!我想我现在明白为什么它以前不起作用了。感谢您澄清这一点。以上是关于如何使用mathematica判定含有变量的不等式的真假?的主要内容,如果未能解决你的问题,请参考以下文章