算法 – Poincaré-Miranda定理的实现

为了测试连续函数是否具有根,给定区间中的一个简单根[x0,x1]相对容易:根据
Intermediate value theorem,当x0处的函数值的符号与x1处的符号相反时,存在(至少)一根.

例如,给定二次函数:

g(x): a*x**2 + b*x + c = 0

测试看起来像:

if sign of g(x0) is opposite of sign of g(x1)
then return true
else return false

对于多变量情况有Poincaré–Miranda theorem但我在阅读链接文章时正确实施测试有点困难.

给出两个二次双变量函数:

g1(x, y): a1*x**2 + b1*y**2 + c1*x*y + d1*x + e1*y + f1 = 0
g2(x, y): a2*x**2 + b2*y**2 + c2*x*y + d2*x + e2*y + f2 = 0

和一个矩形区域[x0,x1] x [y0,y1],如何检查区域中是否至少有一个根?

我的意思是,我认为测试应该看起来有点像(这不起作用):

if (sign of g1(x0, y0) is opposite of sign of g1(x1, y0) and
    sign of g1(x0, y1) is opposite of sign of g1(x0, y1) and
    sign of g2(x0, y0) is opposite of sign of g2(x1, y0) and
    sign of g2(x0, y1) is opposite of sign of g2(x0, y1))
then return true
else return false

请问,是否有人知道要检查的功能对,间隔终点和逻辑运算符以及检查顺序是什么?

最佳答案 你需要检查你的双变量是否起作用

g1(x, y): a1*x**2 + b1*y**2 + c1*x*y + d1*x + e1*y + f1 = 0
g2(x, y): a2*x**2 + b2*y**2 + c2*x*y + d2*x + e2*y + f2 = 0

满足

I).  g1(x0,y) < 0, for all y in [y0,y1]
II). g2(x,y0) < 0, for all x in [x0,x1]

III). g1(x1,y) > 0, for all y in [y0,y1]
IV).  g2(x,y1) > 0, for all x in [x0,x1]

您的函数是二次函数,因此可以在没有对4个案例的所有4个边界采样值的情况下完成.例如,对于g1(x0,y)的第一个条件,只需为x插入x0,得到y中的二次方程:

G1(y) = b1*y**2 + c1*x0*y + e1*y + (f1 + d1*x0 + a1*x0**2)

我们需要检查[y0,y1]中的G1是否为y.由于G1是二次的,所以它的最大值出现在{G1’= 0,G1”的位置. 0}或在端点.所以:

a. express G1' analytically, use simple bisection to find a root in [y0,y1]
b. if there is one, say y*, express G1'' analytically and compute G1''(y*)
c. if G1''(y*) is also < 0 then you have your maximum y*
d. if G1(y*) > 0 then the condition are violated, you may break
e. if not, then test the endpoints G1(y0), G1(y1).
f. if any of those are > 0 then break.

如果您的函数通过了这些测试而没有中断,那么您已满足上述4个条件(I)中的第一个条件.

可以以类似的方式测试条件(II-IV).如果所有条件都成立,则Miranda测试成立并且您具有两个函数的重合根.如果没有,那么你处于“可能”的情况 – 函数可能仍然有一个共同的根,但你必须使用不同的方法来证明存在.

点赞