чтобы найти решение.

интересует общая проблема поиска корней для интерполяционной функции.

Предположим, у меня есть следующее(x, y) данные:

set.seed(0)
x <- 1:10 + runif(10, -0.1, 0.1)
y <- rnorm(10, 3, 1)

а также линейная интерполяция и интерполяция кубического сплайна:

f1 <- approxfun(x, y)
f3 <- splinefun(x, y, method = "fmm")

Как я могу найтиx-значения, когда эти интерполяционные функции пересекают горизонтальную линиюy = y0? Ниже приведена графическая иллюстрация сy0 = 2.85.

par(mfrow = c(1, 2))
curve(f1, from = x[1], to = x[10]); abline(h = 2.85, lty = 2)
curve(f3, from = x[1], to = x[10]); abline(h = 2.85, lty = 2)

Мне известно о нескольких предыдущих темах на эту тему, например,

предсказать значения х из простого подбора и аннотировать его на графикеПредсказать значение X из значения Y с помощью подобранной модели

Предполагается, что мы просто поменятьx а такжеy, сделай интерполяцию для(y, x) и вычислить интерполированное значение вy = y0.

Тем не менее, это ложная идея. Позволятьy = f(x) быть функцией интерполяции для(x, y)эта идея верна только тогда, когдаf(x) является монотонной функциейx так чтоf является обратимым В противном случаеx не является функциейy и интерполировать(y, x) без разницы.

Принимая линейную интерполяцию с данными моего примера, эта ложная идея дает

fake_root <- approx(y, x, 2.85)[[2]]
# [1] 6.565559

Прежде всего, количество корней неверно. Мы видим два корня из рисунка (слева), но код возвращает только один. Во-вторых, это не правильный корень, так как

f1(fake_root)
#[1] 2.906103

не 2,85.

Я сделал свою первую попытку по этой общей проблеме вКак оценить значение x из значения y, введенного после приближения () в R, Решение оказывается устойчивым для линейной интерполяции, но не обязательно устойчивым для нелинейной интерполяции. Сейчас я ищу стабильное решение, особенно для кубического интерполяционного сплайна.

Как решение может быть полезным на практике?

Иногда послеодномерный линейная регрессияy ~ x илиодномерный нелинейная регрессияy ~ f(x) мы хотим отступитьx для целиy, Этот Q & A является примером и привлек много ответов:Решите наиболее подходящие полиномиальные и построите выпадающие линии, но ни один из них не является действительно адаптивным или простым в использовании на практике.

Принятый ответ с использованиемpolyroot работает только для простой полиномиальной регрессии;Ответы, использующие квадратичную формулу для аналитического решения, работают только для квадратичного полинома;Мой ответ с помощьюpredict а такжеuniroot работает в общем, но не удобно, так как на практике используюuniroot необходимо взаимодействие с пользователями (см.Uniroot решение в R больше наuniroot).

Было бы очень хорошо, если бы существовало адаптивное и простое в использовании решение.

Ответы на вопрос(2)

Ваш ответ на вопрос