Решение для параметра внутри функции в R

Если у меня есть функция

fun=function(x,y) {x^2+y^2}

где x и y - векторы. Я хотел бы найти "х" такое, что x ^ 2 + y ^ 2 = z, численно в R. Как мне это сделать? Я попытался использовать команду solve но я не уверен, как указать... сохранить вектор y теми же значениями, решить/минимизировать расстояние/ошибку от функции x ^ 2 + y ^ 2 до z до 0.

2 ответа

Здесь решение с участием uniroot:

fun <- function(x,y) x^2 + y^2

solfun <- function(z,y) {
 if (y^2 > z) return(NaN)
 return(uniroot(function(x) z - fun(x,y), c(0,1e10))$root)
}

z <- sample(1:100,5,repl=TRUE)
y <- sample(1:100,5,repl=TRUE)

unlist(Map(solfun,z,y))

Как и в любом алгоритме поиска корней, он может получить только приблизительные ответы:

> solfun(20,3)
[1] 3.31661
> solfun(10,3)
[1] 0.9999985

Хотя вышеприведенная функция работает с отдельными парами значений z и y, используя Map мы можем применить эту функцию к векторам.

set.seed(4)
z <- sample(1:100,5,repl=TRUE)
y <- sample(1:100,5,repl=TRUE)

> unlist(Map(solfun,z,y))
[1] NaN NaN NaN NaN 4.242638

Отметим, что подавляющее большинство пар z, y имеют сложные корни.


Следующие могут быть полезны:

z = sample(1:100, 100, replace=T)
y = sample(1:100, 100, replace=T)

x = mapply(function(z,y) sqrt(z-y^2), z,y)
dd =data.frame(z=z,y=y,x=x)
dd[!is.na(dd$x),]
 z y x
51 27 2 4.795832
54 78 5 7.280110
66 74 5 7.000000
70 33 1 5.656854
83 81 9 0.000000
100 29 1 5.291503

licensed under cc by-sa 3.0 with attribution.