使用浮动算法从y = x函数获取x值

时间:2019-01-11 13:18:23

标签: r

我有一个已知的功能:

eq = function(x){(4E-11*x^4)-(2E-8*x^3)-(1E-5*x^2)+(0.0132*x)+0.1801}

我想从已知的y值中获取x值。但是,由于浮点运算的原因,我不能像这个问题一样使用whichHow 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方法?

2 个答案:

答案 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为零的位置。尽管我为简单起见添加了默认值,但您需要指定要查看的间隔(由lbub定义,以及精度(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的帮助下找到它,但是... 由于多种原因,计算机极不可能给出确切的解决方案。两个是您要表示的浮点问题,但另一个大问题是,对于大多数解决方案,一个人不能写一个“精确”数字,因为一个无理数只能以十进制形式写成无重复的无穷十进制形式。