在R中使用uniroot求解指数函数根得到错误结果的原因咨询
问题描述
我有一个指数函数:
f = function(x){ exp(3*x)+4*exp(2*x)-3*exp(x) }
该函数的唯一实根被认为是$\sqrt{7}-2$(约0.6457513),但在R中执行以下代码求解根时:
uniroot(f, lower = -3, upper = 3)$root [1] -0.4373415
得到的结果并非预期值,请问出现该问题的原因是什么?
问题原因分析
根的概念混淆
原函数可通过换元简化:令$y=e^x$($y>0$,指数函数值域恒正),函数转化为:
$$y^3 + 4y^2 - 3y = y(y^2 + 4y - 3)$$
解方程$y(y^2 + 4y - 3)=0$,因$y>0$,仅需解二次方程$y^2 + 4y - 3=0$,得正根为$y=-2+\sqrt{7}\approx0.6457513$——这是换元后$y$的根,而非$x$的根。对应的x的实根是$x=\ln(y)=\ln(-2+\sqrt{7})\approx-0.4373415$,和uniroot计算的结果完全一致。uniroot的工作逻辑
R的uniroot函数要求输入区间[lower, upper]内,函数两端点取值符号相反(即$f(lower)*f(upper)<0$),它会在该区间内寻找函数值为0的点。计算你的函数在区间端点的值:- $f(-3)=e{-9}+4e{-6}-3e^{-3}\approx-0.143$(负值)
- $f(3)=e9+4e6-3e^3\approx9670$(正值)
区间内存在符号变化,uniroot找到的是该区间内唯一的实根,也就是正确的x的实根。
内容的提问来源于stack exchange,提问作者Homer Jay Simpson
相关产品推荐
相关产品推荐

