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

使用R中optim()函数求解四次方程时的警告问题咨询

问题分析与解答

一、当前求解方法的正确性

你的思路是正确的:将求方程 (b^4 + 9b^2 - 9 = 0) 的根转化为最小化原函数的绝对值,因为根对应原函数值为0的点,绝对值的最小值点就是根的数值近似。从结果来看,代入根后原函数绝对值约为 (3.8\times10^{-6}),已经非常接近0,数值解的精度足够满足一般需求。

不过需要注意:你用optim()默认的Nelder-Mead算法处理一维优化,并不是最优选择——这也是警告信息出现的核心原因。

二、处理警告信息的方案

警告明确提示,一维优化用Nelder-Mead不可靠,推荐使用Brent方法或直接用optimize(),以下是具体实现:

方案1:在optim()中指定Brent方法

Brent算法是专门针对一维优化设计的,需要指定搜索区间(lower和upper),示例代码:

f <- function(b) {
  abs(b^4 + 9*b^2 - 9)
}

# 找负根
root1 <- optim(par = -2, fn = f, method = "Brent", lower = -3, upper = 0)$par
# 找正根
root2 <- optim(par = 2, fn = f, method = "Brent", lower = 0, upper = 3)$par

# 验证结果
f(root1) # 输出接近0
f(root2)

方案2:直接使用optimize()函数

optimize()是R中专门用于一维单峰函数优化的函数,语法更简洁,效率更高:

f <- function(b) {
  abs(b^4 + 9*b^2 - 9)
}

# 搜索负根区间
root1 <- optimize(f, interval = c(-3, 0))$minimum
# 搜索正根区间
root2 <- optimize(f, interval = c(0, 3))$minimum

# 验证结果
f(root1)
f(root2)

额外补充:解析解验证

原方程可以通过变量替换转化为二次方程,得到解析解,用来验证数值解的准确性:
令 (x = b^2),原方程变为 (x^2 + 9x - 9 = 0),根据求根公式:
[x = \frac{-9 + \sqrt{9^2 + 4\times9}}{2} = \frac{-9 + 3\sqrt{13}}{2} \approx 0.908]
因此 (b = \pm\sqrt{x} \approx \pm0.953),和你的数值解完全一致,说明结果可靠。


内容的提问来源于stack exchange,提问作者stats_noob

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 14:22:41