【问题标题】:Scheme "application: not a procedure;" when calculating a derivative方案“应用程序:不是程序;”计算导数时
【发布时间】:2012-10-28 07:49:44
【问题描述】:

我是 Scheme 的新手,我正在做一个实现随机梯度下降的任务。到目前为止,我相信我的程序结构是正确的,但是我采用函数 f(x) 的导数的程序给我带来了一些麻烦。在代码底部的“尝试”循环中,我递归调用(try (func-eval guess)),其中(func-eval guess) 使用公式*x - alpha*f'(x)*强> 其中 alpha = 0.1。

在计算导数时我似乎遇到了错误...我正在使用 Dr.Racket IDE,它突出显示了以下行有问题: (f (+ x dx)) ...这是我本地派生程序的第二行:

(define (local-minimal first-guess)

;A way to check a guess
(define(good-enough? val1 val2)
(<(abs(- val1 val2)) 0.00001))

; x_new = x_old - alpha*f'(x)    /// f(x)=(x+1)^2+2  //// alpha = 0.1
(define (func-eval x)
  (- x (* 0.1((derivative (+ 2(expt (+ x 1) 2)) 0.00001)x))))

  (define (derivative f dx)
  (lambda (x)
    (/ (- (f (+ x dx)) (f x))
       dx)))

; trys the guess
(define (try guess)
  (if (good-enough? guess -1)
      guess
      (try (func-eval guess))))
(try first-guess)) 

我收到一条错误消息:

application: not a procedure;
 expected a procedure that can be applied to arguments
  given: 3
  arguments...:
   -1.99999

这是语法错误吗?我认为我可以通过使用 (f (+ x dx)) 来表示 f(x+dx) ...。这是否意味着我需要在括号中的 f 之前放置一个运算符?

【问题讨论】:

    标签: recursion functional-programming scheme derivative


    【解决方案1】:

    突出显示和错误消息一起告诉您一些有用的信息:derivative 作为其第一个参数f 接收的不是函数,它需要在(f (+ x dx)) 中调用。论据从何而来?我们可以运行 DrRacket 的调试器,但是在这里我们可以只看代码——唯一调用 derivative 的地方是 func-eval 的第一行,所以我们必须在这里传递一个数字而不是一个函数。果然,(+ 2 (expt (+ x 1) 2))(与x 绑定)只是一个数字,尝试应用它会出错。

    【讨论】:

      【解决方案2】:

      调用derivative 时,第一个参数必须是函数。在下面的过程调用中,第一个参数中的表达式被计算为一个数字,而不是一个函数:

      (derivative (+ 2 (expt (+ x 1) 2)) 0.00001)
      

      要修复它,请将表达式打包到 lambda 中,使其成为实际函数:

      (derivative (lambda (x) (+ 2 (expt (+ x 1) 2))) 0.00001)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多