如何在R语言中找到使函数最小化的多个x?仅得一个解的问题
解决方法:拆分区间或使用根查找函数
你用optimize()只得到一个根的核心原因是:该函数要求目标函数在给定区间内是单峰函数(仅存在一个极值点),但你的hx(x)在[0,2]区间内是双峰结构——对应g(x)=0的两个根,optimize()只能识别并返回其中一个极值点,因此仅得到一个结果。
方法1:拆分区间用optimize()分别查找
先通过绘图确认两个根的大致分布区间:
hx <- function(x){ abs(16*x*exp(1)^(-4*x) - 0.55) } # 绘制函数曲线,观察根的位置 curve(hx, from=0, to=2) abline(h=0, col="red") # 标记y=0线,对应根的位置
从图中可看出,两个根分别落在0到0.5和0.5到2区间内,拆分区间后分别调用optimize():
# 查找第一个根 root1 <- optimize(hx, lower=0, upper=0.5)$minimum # 查找第二个根 root2 <- optimize(hx, lower=0.5, upper=2)$minimum # 输出两个根 root1 root2
执行后即可得到两个根,其中一个就是你已知的0.78左右的数值。
方法2:用uniroot()直接查找方程根
既然目标是找g(x)=16*x*exp(-4x)-0.55=0的根,使用专门的根查找函数uniroot()更直接。该函数要求给定区间内函数两端符号相反(确保区间内存在根):
# 定义原函数g(x) gx <- function(x) { 16*x*exp(-4*x) - 0.55 } # 查找第一个根(区间0到0.5,gx(0)=-0.55,gx(0.5)≈0.53,符号相反) root1 <- uniroot(gx, lower=0, upper=0.5)$root # 查找第二个根(区间0.5到1,gx(0.5)≈0.53,gx(1)≈-0.26,符号相反) root2 <- uniroot(gx, lower=0.5, upper=1)$root # 输出两个根 root1 root2
此方法无需对原函数取绝对值,直接针对方程找根,结果精度更高。
内容的提问来源于stack exchange,提问作者Tintswalo Shivambe
相关产品推荐
相关产品推荐

