【发布时间】: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