【问题标题】:An algorithm for checking if a nonlinear function f is always positive检查非线性函数 f 是否始终为正的算法
【发布时间】:2012-05-24 10:21:31
【问题描述】:

是否有一种算法可以检查给定的(可能是非线性的)函数 f 是否始终为正?

我目前的想法是找到函数的根(使用 newton-raphson 算法或类似技术,请参阅http://en.wikipedia.org/wiki/Root-finding_algorithm)并检查导数,或找到 f 的最小值,但他们没有似乎是这个问题的最佳解决方案,而且寻根算法也存在很多收敛问题。

例如在 Maple 中,函数 verify 可以做到这一点,但我需要在自己的程序中实现它。 Maple 帮助验证:http://www.maplesoft.com/support/help/Maple/view.aspx?path=verify/function_shells 枫树示例: 假设(x,'真实'); 验证(x^2+1,0,'大于'); --> 返回真,因为对于每个 x 我们都有 x^2+1 > 0

[编辑] 关于这个问题的一些背景: 函数 $f$ 是电路的右手边微分非线性模型。非线性电路可以通过应用修正节点分析 (MNA) 建模为一组常微分方程,为简单起见,我们只考虑一维系统,因此 $x' = f(x)$ 其中 $f$ 描述电路,例如 $f$ 可以是 $f(x) = 10x - 100x^2 + 200x^3 - 300x^4 + 100x^5$ (非线性隧道二极管的模型)或 $f=10 - 2sin (4x)+ 3x$(约瑟夫森结的模型)。

$x$ 是有界的,$f$ 只在区间 $[a,b] \in R$ 中定义。 $f$ 是连续的。 我也可以假设 $f$ 是 Lipschitz 且 Lipschitz 常数 L>0,但我不想这样做,除非我必须这样做。

【问题讨论】:

  • Maple 的verify 是否适用于所有可能的功能?比如说,一个 10 次多项式怎么样?
  • 我假设你的意思是一个连续,可能是多项式函数(毕竟f(x) = -1 iff program X halts else +1是一个有效函数)?如果是这样,实际问题是什么?您提到了两种解决方案:找到函数的根 (检查每个根之间的某个点的函数值) 或导数的根 (检查函数的值在这些点中的每一个) - 其中任何一个都应该起作用。
  • 很好的一点,是的,函数应该是连续的。寻根是我最初的解决方案,但就我而言,它存在几个收敛问题。我正在寻找更好的算法。
  • 您是否有f 的分析表格,或者只是一个黑盒函数来评估它?它的衍生物呢?
  • 您可以寻找所有极值,即导数为零的点,而不是寻找函数的根;如果其中任何一个为负,则该函数为负。

标签: algorithm maple nonlinear-functions nonlinear-optimization


【解决方案1】:

如果我正确理解了您的问题,则归结为计算一个区间内的(实)根数,而不必识别它们。事实上,你甚至不需要得到确切的数字,只要它是否等于零。

如果您的函数是多项式,我认为Sturm's theorem 可能适用。 Wikipedia 文章声称另外两个程序是首选的,因此您可能也想查看这些程序。我不确定Descartes' rule of signs 是否在某个区间内有效,但Budan's theorem 似乎确实有效。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-19
    • 1970-01-01
    • 1970-01-01
    • 2020-09-20
    • 1970-01-01
    • 2012-08-18
    • 1970-01-01
    相关资源
    最近更新 更多