扩展函数并用推导计算导数

时间:2013-10-18 14:39:16

标签: r paste sapply

这是我想扩展和派生的函数的乳胶代码:

$f(x) = \sum\limits_{i=1}^n \left(x_i + \frac{h}{2}(1-ih)\sum\limits_{j=1}^i jh(x_j + jh +1)^3 + \frac{h}{2}ih\sum\limits_{j=i+1}^n (1-jh)(x_j+jh+1)^3 \right)^2$

enter image description here

我计划通过n=6推导deriv(expression(myfunction),c('x1', 'x2','x3','x4','x5','x6'))。我不知道如何在不扩展功能的情况下计算导数但是如果有办法请告诉我。

当我尝试在一个字符串中扩展函数时我的问题就开始了,因为表达式的一部分会重复,所以任何帮助都会受到赞赏:

n<-6
myexpr <- sapply(1:n, function(i) paste( paste('x',i,sep=''),paste('+h/2*(1-',i,'*h)*(',sep=''),
                           sapply(1:i,function(j) paste('(j*h*(',paste('x',j,sep=''),'j*h+1)^3)',collapse='+')),
                           paste('+h/2*',i,'*h*(',sep=''),
                           sapply((i+1):n,function(j) paste('((1-j*h)*(',paste('x',j,sep=''),'+j*h+1)^3)',collapse='+'))
                           ,collapse='+'))


deriv(expression(myexpr),c('x1', 'x2','x3','x4','x5','x6'))

2 个答案:

答案 0 :(得分:2)

我认为你应该尝试更简单的方法来处理表达式。在你的情况下,我可以通过简单地查看第一个参数来找到构造这个(可笑的大)表达式的错误。

> do.call(deriv, list(expr=parse(text=myexpr[1]), namevec=c('x1') ) )
Error in parse(text = myexpr[1]) : <text>:1:31: unexpected symbol
1: x1 +h*0.5*(1-1*h)*( (j*h*( x1 j
                                  ^
> substr(myexpr[1],1,40)
[1] "x1 +h*0.5*(1-1*h)*( (j*h*( x1 j*h+1)^3) "

所以你错过了一个“+” - 在第二个任期的扩展中签名。

然而,从策略上讲,我认为Mathematica或Maxima是更好的平台,可用于此目的。

答案 1 :(得分:0)

我一直在投票,但我可以做到这一点。事实上,不仅可以做到这一点,而且R解决得非常快:

z <- paste(
  sapply(1:6, function(i,n=6) {

    require(MASS)
    h <- fractions(1/(n+1))

    a <- paste('x',i,sep='')
    b <- paste('+.5*',h,'*(1-',i,'*',h,')*(',sep='')
    cc <- paste(sapply(1:i,function(j) paste(j,'*',h,'*(',paste('x',j,sep=''),'+',j,'*',h,'+1)^3',sep='')),collapse='+')
    d <- paste(a,b,cc,')')

    e <- if (i < 6) paste('+.5*',h,'*(',i,'*',h,')*(',sep='') else ''
    f <- if (i < 6) paste(sapply((i+1):n,function(j) paste('(1-',j,'*',h,')*(',paste('x',j,sep=''),'+',j,'*',h,'+1)^3',sep='')),collapse='+') else ''
    g <- paste(e,f,ifelse(i!=6,')',""))

    paste('(',d,g,')^2',sep='')

  }
  ),
  collapse='+')

deriv(parse(text=z),c('x1','x2','x3','x4','x5','x6'))