将函数定义为有限和

时间:2015-10-29 07:13:36

标签: r function sum

如何将R中的函数正确定义为有限和?当我尝试将函数定义为有限和时,我从R得到不一致的行为,如下所示。该函数正确评估但不会在不返回错误的情况下绘制或查找最大值或最小值。见下面的M!WE。

m = 1:3
y <- seq(-1 , 1 , by =0.01 )
data <- as.vector(  c(-pi , exp(1) , 0.1 ) )
g <- function(y){
  ifelse( abs(y)==0.5 | y==0 , sum(data[m]) , sum(data[m]*( sin(2 *pi *y - pi * (m-2)) / ( 2 *pi *y - pi *(m-2) ) ) ) )
}
g(0)
# [1] -0.3233108
g(0)==g(-0.5) 
# [1] TRUE 
g(-1/sqrt(2)) 
# [1] -2.904101 
plot(g,y) 
Warning messages: 
1: In 2 * pi * y - pi * (m - 2) : 
  longer object length is not a multiple of shorter object length 
2: In 2 * pi * y - pi * (m - 2) : 
  longer object length is not a multiple of shorter object length 
3: In data[m] * (sin(2 * pi * y - pi * (m - 2))/(2 * pi * y - pi *  : 
  longer object length is not a multiple of shorter object length 
max(g(y))
# [1] NaN 

问题在于图表存在并且表现良好,并且最大(和最小值)都存在且甚至是唯一的。更令人困惑的是,错误消息在数学上是错误的。序列y的长度绝对是向量m的长度的倍数(实际上恰好是100的因子)。

我尝试了以下事情但无济于事。

  1. 将序列y包含在as.numeric()中,希望它能够正确地强制使用向量m-2,就像m和-2一样,但这没有任何帮助。
  2. y中的序列包含在as.vector()中,希望R最终能够实现这两个长度相关的100倍。再次,这并没有帮助。
  3. 我知道我必须在这里做一些根本性的错误,但我不清楚缺乏经验,并且对于函数如何为其域中的每个元素返回实数而感到困惑,但不能成为作图。而且,我意识到可能有一些软件包可以通过改写输入来消除所有麻烦,但是我的数学家不能让这些令人费解的矛盾无法解释。

1 个答案:

答案 0 :(得分:2)

使用此:

plot(y,sapply(y,g))

enter image description here

max(sapply(y,g))
[1] 3.056132

min(sapply(y,g))
[1] -3.363206

您的函数中的问题似乎如下:当您使用g(y)时,如果y与-0.5,0或0.5不同,函数data[m]*( sin(2 *pi *y - pi * (m-2)) / ( 2 *pi *y- pi *(m-2) ) )将从每个值创建一个向量y然后将它总结。但是第101个元素是NaN,因此总和是NaN,因此对于几乎所有的值,g(y)将是NaN。使用sapply(y,g)将为y的每个元素应用函数,从而避免任何问题。