找到Mathematica的2个PDF函数的第1个交集

时间:2011-12-12 17:51:13

标签: wolfram-mathematica

使用Mathematica 8.0.1.0,我使用FindRoot[]来识别两个2 pdf函数的交集。

但是如果我的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[]的方法返回第一个十字路口而不是第二个路口?

如果没有,有人可以提出另一种方法吗?

2 个答案:

答案 0 :(得分:4)

使用FindRoot[],您只能获得给定起点的单个根。迭代不同的选项很麻烦,除非你选择正确的起点,否则你甚至可能无法获得某些边缘情况的预期结果。

在这种情况下,NSolveReduce之类的内容可能是更好的选择。如果您知道表达式衰减,使用x的可能值的合理上限,您可以使用以下内容,这非常快,并且将为您提供所有根。

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

答案 1 :(得分:1)

以下内容如何:

首先,你必须一步找到所有的根。我这样做

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

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

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