2

私は現在、FDTD シミュレーションを実行するためのスキームを学習しようとしていますが、ガウス関数を 2 次元で構築するのに問題があります。

フォーラムで、1D のこの可能性を見つけました。

(define ( (gaussx sigma) x)
   (exp (- (/ (vector3-dot x x) (* 2 sigma sigma)))))

カリー化を正しく理解していれば、次と同等です。

(define  (gauss sigma)
   (lambda(x)
      (exp (- (/ (vector3-dot x x) (* 2 sigma sigma))))))

関数を x 方向と y 方向の両方に沿ってガウスにしたいのですが、これが機能しない理由がわかりません。

(define  (gauss sigma)
   (lambda(x)
      (lambda(y)
         (exp (- (/ (+ (vector3-dot y y) (vector3-dot x x)) (* 2 sigma sigma))))

電話すると

(gauss 1)

次のメッセージが表示されます。

ERROR: Wrong type (expecting real number): # <procedure> #f (y)

誰かが私が間違っていることを見ていますか? 他のソリューションも試しましたが、ここでロジックが得られないようです...

助けてくれてどうもありがとう!

よろしくメイ

4

1 に答える 1

1

ここでダブルカリー化する必要はないと思います。これを試してみてください。

(define (gauss sigma)
  (lambda (x y)
    (exp (- (/ (+ (vector3-dot y y) (vector3-dot x x)) (* 2 sigma sigma))))))

このように呼んでください:

(define gauss-1 (gauss 1))
(gauss-1 some-x some-y)

しかし、間違いなくダブルカリーが必要な場合は、これでうまくいくはずです。

(define (gauss sigma)
  (lambda (x)
    (lambda (y)
      (exp (- (/ (+ (vector3-dot y y) (vector3-dot x x)) (* 2 sigma sigma)))))))

このように使用する:

(define gauss-1 (gauss 1))
((gauss-1 some-x) some-y)
于 2013-01-23T15:35:19.350 に答える