使用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
相关产品推荐
相关产品推荐

