我有一个已知的功能:
eq = function(x){(4E-11*x^4)-(2E-8*x^3)-(1E-5*x^2)+(0.0132*x)+0.1801}
我想从已知的y值中获取x值。但是,由于浮点运算的原因,我不能像这个问题一样使用which
:How to find the x-value given the y-value from a plot in R。
是否有一种方法可以在知道y的情况下获得确切的x值,还是必须采用本示例predict x values from simple fitting and annoting it in the plot中所建议的approx
方法?
答案 0 :(得分:2)
也许您可以使用uniroot
。这是一个粗略的解决方案:
# Original function
eq <- function(x){(4E-11*x^4)-(2E-8*x^3)-(1E-5*x^2)+(0.0132*x)+0.1801}
# Find x value corresponding to y value
find_y <- function(y, lb = 0, ub = 1e6, acc = 1e-3){
uniroot(function(x)eq(x)-y, c(lb, ub), tol = acc)
}
找到eq(x)-y
为零的位置。尽管我为简单起见添加了默认值,但您需要指定要查看的间隔(由lb
和ub
定义,以及精度(acc
)。
# Test the y finding function
find_y(0.3)
# $`root`
# [1] 9.147868
#
# $f.root
# [1] -1.330955e-09
#
# $iter
# [1] 26
#
# $init.it
# [1] NA
#
# $estim.prec
# [1] 5e-04
在此输出中,root
是对应于y=0.3
的x值。让我们检查原始方程式中的结果:
# > eq(9.147868)
# [1] 0.3
一个隐含的假设是,在给定的时间间隔内,只有一个y值与您的x值相对应。
答案 1 :(得分:1)
一个四次方程可以有0,2或4个解。如果是我,我会在很大的时间间隔内绘制函数的图形,并检查一下是否有根。那为什么不简单地使用梯度下降呢?有一个公式可以为任何四次方程式提供“精确”的解决方案-您可以在Google的帮助下找到它,但是... 由于多种原因,计算机极不可能给出确切的解决方案。两个是您要表示的浮点问题,但另一个大问题是,对于大多数解决方案,一个人不能写一个“精确”数字,因为一个无理数只能以十进制形式写成无重复的无穷十进制形式。