Wolfram mathematica 使用Mathematica查找2个PDF函数的第一个交点
在Mathematica 8.0.1.0中,我使用了Wolfram mathematica 使用Mathematica查找2个PDF函数的第一个交点,wolfram-mathematica,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[
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[]
只返回第一个交叉点而不是第二个交叉点
如果没有,有人能建议另一种方法吗?下面的方法如何: 首先,你必须一步找到所有的根。我这样做是因为
roots=Reduce[pdf1==pdf2&&0.000001<x<0.5,x]
那么以下内容如何: 首先,你必须一步找到所有的根。我这样做是因为
roots=Reduce[pdf1==pdf2&&0.000001<x<0.5,x]
使用
FindRoot[]
,您只能获得给定起点的单个根。迭代不同的选项是很麻烦的,对于某些边缘情况,您甚至可能无法获得所需的结果,除非您选择了正确的起点
在这种情况下,类似于NSolve
或Reduce
的内容可能是更好的选择。如果您知道表达式会衰减,那么可以使用合理的上限值x
,您可以使用下面的方法,这非常快,可以为您提供所有根
NSolve[{pdf1==pdf2,00.0452777},{x->0.464719}
使用FindRoot[]
,您只能获得给定起点的单个根。迭代不同的选项是很麻烦的,对于某些边缘情况,您甚至可能无法获得所需的结果,除非您选择了正确的起点
在这种情况下,类似于NSolve
或Reduce
的内容可能是更好的选择。如果您知道表达式会衰减,那么可以使用合理的上限值x
,您可以使用下面的方法,这非常快,可以为您提供所有根
NSolve[{pdf1==pdf2,00.0452777},{x->0.464719}
提供的两种解决方案(您的和yoda的)都有效。非常感谢您的建议,看起来yoda的在我的应用程序中效果最好。您和yoda提供的两种解决方案都有效。非常感谢你的建议,看起来尤达的软件在我的应用程序中效果最好。我有两种方法来解决这个问题。非常感谢。我有两种方法来解决这个问题。非常感谢。
NSolve[{pdf1 == pdf2, 0 < x < 1}, x] // Timing
Out[1]= {0.073495, {{x -> 0.0452777}, {x -> 0.464719}}}