我有以下功能(例如):
f<-function(x,a,b) a*sinh(x/b)
其中x是-L到L的实数 此外,a和b分别从a1到a2和从b1到b2离散地递增。 (例如,循环一些步骤)
我想知道如何绘制f_max
(最多f
为-L&lt; x&lt; L)和f_avg
(f超过-L&lt的平均值) ; {&lt; L}与a
在b
也在变化的同一图中。我正在寻找这样的事情:
如果我的问题中遗漏了任何内容,请根据需要做出任何假设(不要求)。无论如何它应该有所帮助,因为我的问题很普遍。
您可能会注意到我正在尝试在一个2D图形中可视化2个不同的3D图形(f_max vs a vs b)和(f_avg vs a vs b)。 ggplot2加上着色和线性曲线拟合非常受欢迎。
答案 0 :(得分:1)
正如评论所示,您需要先创建一个值网格,但此类任务不需要optim
和integrate
个建议。
grid.xab <- expand.grid(a = c(4,5,6),
b = c(1,1.5,2),
x = seq(-2, 3, length.out = 50))
a b x 1 4 1.0 -2 2 5 1.0 -2 3 6 1.0 -2 4 4 1.5 -2 5 5 1.5 -2 6 6 1.5 -2 ... 445 4 1.5 3 446 5 1.5 3 447 6 1.5 3 448 4 2.0 3 449 5 2.0 3 450 6 2.0 3
您会看到, a 和 b 值的所有可能组合都包含 x 值的范围。根据您需要的精度,您可以更改length.out =
。现在,您可以在每个点评估 f ( x )。
library(dplyr)
library(ggplot2)
grid.xabf <- grid.xab %>% mutate(fx = a*sinh(x/b))
a b x fx 1 4 1.0 -2 -14.507442 2 5 1.0 -2 -18.134302 3 6 1.0 -2 -21.761162 4 4 1.5 -2 -7.060142 5 5 1.5 -2 -8.825177 6 6 1.5 -2 -10.590212 ... 445 4 1.5 3 14.507442 446 5 1.5 3 18.134302 447 6 1.5 3 21.761162 448 4 2.0 3 8.517118 449 5 2.0 3 10.646397 450 6 2.0 3 12.775677
你可以看到这个:
ggplot(grid.xabf, aes(x, fx)) +
geom_line(aes(color = factor(a), linetype = factor(b)))
现在我们只需要折叠所有 x 值,以获得每个 f ( x )的最大值和平均值> a 和 b 。
f.hat <- grid.xabf %>%
group_by(a, b) %>%
summarise(fmax = max(fx), favg = mean(fx))
# A tibble: 9 x 4 # Groups: a [?] a b fmax favg <dbl> <dbl> <dbl> <dbl> 1 4 1.0 40.071500 5.203415 2 4 1.5 14.507442 2.113929 3 4 2.0 8.517118 1.307466 4 5 1.0 50.089375 6.504269 5 5 1.5 18.134302 2.642412 6 5 2.0 10.646397 1.634333 7 6 1.0 60.107250 7.805122 8 6 1.5 21.761162 3.170894 9 6 2.0 12.775677 1.961199
现在我们终于可以制作你想要的数字了:
p1 <- ggplot(f.hat) +
geom_line(aes(a, fmax, color = factor(b), linetype = "f(x) max")) +
geom_line(aes(a, favg, color = factor(b), linetype = "f(x) avg")) +
geom_point(aes(a, fmax, color = factor(b)), shape = 16) +
geom_point(aes(a, favg, color = factor(b)), shape = 1)
p1
但我们也可以让它更好一些:
p1 +
scale_linetype_manual(values = c("f(x) max" = "solid",
"f(x) avg" = "dashed"),
labels = c("f(x) max" = expression(bold(max)~italic(f)(x)),
"f(x) avg" = expression(bar(italic(f)(x)))),
name = expression(widehat(italic(f)(x)))) +
labs(y = expression(widehat(italic(f)[-2]^3*(x))),
color = "b",
title = expression(italic(f)(x)==a%.%bold(sinh)*bgroup("(",frac(x, b),")")))