2011-12-12 11 views
1

随着数学8.0.1.0,我已经使用FindRoot[]识别两个2 PDF函数的交点。找到2种PDF功能的第一个路口用Mathematica

但是,如果我有相交于一个以上的点PDF功能,并且我有x轴范围超过所述第二交叉点的上限,仅FindRoot[]返回第二交集。

pdf1 = 1/x 0.5795367855565214` (E^(
    11.170058830053032` (-1.525439351903338` - Log[x])) 
    Erfc[1.6962452696714152` (-0.5548887795964352` - Log[x])] + 
E^(1.2932713057519` (2.60836043407439` + Log[x])) 
    Erfc[1.6962452696714152` (2.720730943938539` + Log[x])]); 

pdf2 = 1/x 0.4648445097126269` (E^(
    5.17560914275408` (-2.5500941338198615` - Log[x])) 
    Erfc[1.7747318880142482` (-2.139288893723375` - Log[x])] + 
E^(1.1332542415053757` (3.050849516581922` + Log[x])) 
    Erfc[1.7747318880142482` (3.1407996592474956` + Log[x])]); 

Plot[{pdf1, pdf2}, {x, 0, 0.5}, PlotRange -> All] (* Shows 1st intersection *) 
Plot[{pdf1, pdf2}, {x, 0.4, 0.5}, PlotRange -> All] (* Shows 2nd intersection *) 

{x /. FindRoot[pdf1 == pdf2, {x, 0.00001, 0.5}], 
x /. FindRoot[pdf1 == pdf2, {x, 0.00001, 0.4}]} 

enter image description here enter image description here

以上图显示的问题。当绘制时,它们相交于两点:

{0.464719, 0.0452777} 

因为我以前不知道如果我有第二个交点,我不知道它可能落在x轴上的位置,如果我这样做,任何人都可以建议一种方法,让FindRoot[]只返回第一个交叉而不是第二?

如果没有,任何人都可以提出另一种方式去了解它?

回答

4

随着FindRoot[],你只能得到一个根对于给定的起点。通过不同的选项进行迭代是麻烦,你可能甚至不获得对某些边缘情况下,期望的结果,除非你击中后出发点的正确选择。

在这种情况下,像NSolveReduce可能是一个更好的选择。如果你知道你的表情腐烂,采用合理的上限的x可能的值,你可以使用下面的,这是相当快的,会给你所有根。

NSolve[{pdf1 == pdf2, 0 < x < 1}, x] // Timing 
Out[1]= {0.073495, {{x -> 0.0452777}, {x -> 0.464719}}} 
+0

我已经用两种方法解决了这个问题。非常感谢。 – Jagra

1

以下情况如何:

首先你必须在一个步骤中找到所有的根。我这样做与

roots=Reduce[pdf1==pdf2&&0.000001<x<0.5,x] 

然后你可以采取(在你的特殊情况,第一根在x轴)的最小值。

rootMin=Min[N[x/.{ToRules[roots]}]] 
+0

提供的两种解决方案(您的和yoda的)工作。非常感谢您的建议,似乎yoda在我的应用程序中运行得最好。 – Jagra

相关问题