Использование «кривой» для построения функции: сложное выражение? - PullRequest
0 голосов
/ 26 июня 2018

Мой вопрос касается чего-то, что должно быть довольно простым, но я не могу заставить его работать.Я имею в виду, что вы можете вычислить x и y и затем построить их с помощью функции plot.Но можно ли это сделать с помощью функции curve?

Я хочу построить следующую R функцию f2:

n <- 1
m <- 2
f2 <- function(x) min(x^n, x^(-m))

Но этот код не выполняется:

curve(f2, 0, 10)

Есть предложения?

Ответы [ 3 ]

0 голосов
/ 26 июня 2018

Вам нужно использовать векторизацию pmin вместо min (взгляните на ?pmin, чтобы понять разницу)

f2 = function(x, n = 1, m = 2) {
    pmin(x^n, x^(-m))
}

curve(f2, from = 0, to = 10)

В примечании, я бы сделал n иm аргументы f2 для избежания глобальных переменных.

enter image description here


Обновление

Для построения f2 для разные аргументы n и m вы бы сделали

curve(f2(x, n = 2, m = 3), from = 0, to = 10)

enter image description here

0 голосов
/ 26 июня 2018

Как уже указывалось, главная причина, по которой вызов curve завершается неудачей, заключается в том, что для curve требуется векторизованная функция (в данном случае введите вектор результатов и получите вектор результатов), а вашФункция f2 () только вводит и выводит скаляр.Вы можете векторизовать ваш f2 на лету с помощью Vectorize

n <- 1
m <- 2

f2 <- function(x) min(x^n, x^(-m))
curve(Vectorize(f2)(x), 0, 10)
0 голосов
/ 26 июня 2018

Нужна ли функция curve или это сработает?

n <- 1 # assumption
m <- 2 # assumption

f2 <- function(x) min(x^n, x^(-m))

x.range <- seq(0, 10, by=.1) 
y.results <- sapply(x.range, f2) # Apply a Function over a List or Vector
# plot(x.range, y.results) old answer
plot(x.range, y.results, type="l") # improvement per @alistaire

enter image description here

...