如何使用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判定含有变量的不等式的真假?的主要内容,如果未能解决你的问题,请参考以下文章

在一定参数范围内,mathematica如何比较等式大于零还是小于零

四边形不等式

算法训练营:等式

mathematica画三维曲面

mathematica中怎么定义一个变量为正整数?

在mathematica中分配变量