You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 22:23:10