Получить значения x из функции y = x с плавающей арифметикой - PullRequest
0 голосов
/ 11 января 2019

У меня есть известная функция:

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

Я хочу получить значения x из известных значений y. Однако из-за арифметики с плавающей запятой я не могу использовать which как в этом вопросе: Как найти значение x по значению y из графика в R .

Есть ли способ получить точные значения x, зная y, или мне нужно пойти по пути approx, как предложено в этом примере предсказать значения x из простого подбора и аннотировать его на графике ?

Ответы [ 2 ]

0 голосов
/ 11 января 2019

У четвертого уравнения может быть 0,2 или 4 решения. Если бы это был я, я бы построил график функции на большом интервале и проверил, чтобы понять, где, если есть, есть корни. Тогда почему бы просто не использовать градиентный спуск? Существует формула, которая даст «точное» решение для любого квартичного уравнения - вы можете найти это с помощью Google, но ... Маловероятно, что компьютер может дать точное решение по многим причинам. Два - это проблема с плавающей запятой, которую вы имели в виду, но другая большая проблема заключается в том, что нельзя написать «точное» число для большинства решений, потому что иррациональное число может быть записано только в десятичной форме как бесконечная десятичная дробь без повторяющегося шаблона.

0 голосов
/ 11 января 2019

Возможно, вы могли бы использовать 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 - это значение x, соответствующее y=0.3. Давайте проверим результат в вашем исходном уравнении:

# > eq(9.147868)
# [1] 0.3

Неявное предположение состоит в том, что существует только одно значение y, соответствующее вашему значению x в данном интервале.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...