【问题标题】:How to find the points where a polynomial fit passes through zero如何找到多项式拟合通过零的点
【发布时间】:2016-02-22 21:39:57
【问题描述】:

我已经为我的数据拟合了一条四阶多项式曲线,如下所示:

y<-c(-13,16,35,40,28,36,43,33,40,33,22,-5,-27,-31,-29,-25,-26,-31,-26,-24,-25,-29,-23,4)
x<-1:24

#4th order polynomial fit
fit<-lm(y~poly(x,4,raw=TRUE))

plot(x,y,ylim=c(min(y)-10,max(y)+10))
lines(x,predict(fit,data.frame(x=x)),col="red")
abline(h=0,lty=2)

我的最终目标是计算这条曲线与零线相交的 3 个点。

首先,我需要延长曲线拟合的末端,使其第三次越过零线。完成此操作后,我想计算该方程通过零线的 3 个点。

【问题讨论】:

    标签: r curve-fitting polynomial-math polynomials polynomial-approximations


    【解决方案1】:

    您可以使用predict 函数从您的拟合模型中获取值。例如

    pred <- function(x) predict(fit, newdata=data.frame(x=x))
    

    然后,如果您想要多个根,可以使用 rootSolve 包中的 uniroot.all 之类的函数

    rootSolve::uniroot.all(pred, c(0,30))
    # 1.428859 11.990087 24.420745
    

    这将从您的模型中找到 0 到 30 之间的根。您也可以多次调用基本函数uniroot

    【讨论】:

    • 有了uniroot,除了重复的猜测和检查间隔之外,还有什么更稳健的方法可以找到所有的根吗?为了清楚起见,我还设置了pred &lt;- function(y) ... x = y...
    • 使用这样的多项式,您可以求导数并找到拐点并将其用作区间我猜?但据我所知,从最一般的意义上说,找到所有根并不是一个容易的问题。
    猜你喜欢
    • 1970-01-01
    • 2019-03-02
    • 1970-01-01
    • 2019-10-22
    • 1970-01-01
    • 2013-02-17
    • 2016-05-02
    • 2022-07-22
    • 2018-03-16
    相关资源
    最近更新 更多