使用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}]}
以上情节显示了这个问题。绘制时,它们在两点相交:
{0.464719, 0.0452777}
分别
我手头还不知道如果我有第二个交叉点并且我不知道它可能落在x轴上的位置,如果我这样做了,有人可以建议只有FindRoot[]
的方法返回第一个十字路口而不是第二个路口?
如果没有,有人可以提出另一种方法吗?
答案 0 :(得分:4)
使用FindRoot[]
,您只能获得给定起点的单个根。迭代不同的选项很麻烦,除非你选择正确的起点,否则你甚至可能无法获得某些边缘情况的预期结果。
在这种情况下,NSolve
或Reduce
之类的内容可能是更好的选择。如果您知道表达式衰减,使用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]}]]