1

私が書いたことが正しいかどうか疑問に思いました。これは学校向けのプロジェクトなので、アップロードする前に正しい出力が得られることを確認したいと思います。

cos x = 1 - ((x^2)/(2!)) + ((x^4)/(4!)) - ((x^6)/(6!)) + を計算するための数学的アルゴリズム。 ..

だからここに私のコードがあります:

(define (calc-cos x n)
  (define (hulp ctr res prevPow prevFac switch)
    (let ((switchOp (if (eq? (modulo switch 2) 0) + -)))
      (if (> ctr (+ 2 n))
          res
          (let ((newPow (* prevPow x x))
                (newFac (* (- ctr 1) ctr prevFac)))
            (hulp (+ ctr 2) (switchOp res (/ newPow newFac)) newPow newFac (+ switch 1))))))
  (hulp 2 1 1 1 1))
4

1 に答える 1

1

ここで計算しようとしていることをより正確に定義しましょう。無限の合計があります:

1 - ((x^2)/(2!)) + ((x^4)/(4!)) - ((x^6)/(6!)) + ...

ここでの「...」は、「プロセスが永遠に続く」という非公式の表記であることを認識してください。これは正式な表記法ではありません。パターンが何であるかを読者に考えてもらいます。和の条件がどうあるべきかを正式に表現しましょう。

T_n を n 番目の項とします。

T_n = (-1)^n * x^(2n)/(2n)!

これが部分和の第 n 項の正式な表現であることを認めますか?

もしそうなら、これをプログラミング言語で表現できます。

(define (t_n x n)
  (/ (* (expt -1 n) 
        (expt x (* 2 n)))
     (fact (* 2 n))))

(define (fact n)
  (if (= n 0)
      1
      (* n (fact (sub1 n)))))

t_n が計算するものがあなたの関数が計算するものかどうかはわかりません。ここでの t_n 関数は、数学関数の正確な表現だと思います。

t_n が部分和の n 番目の項を計算することを受け入れると、次のようになります。

(define (cos/approx x)
  (for/sum ([k (in-range 100)])
    (t_n x k)))

コサインの近似値として受け入れられるはずです。

正しい cos/approx の定義から始めたら、蓄積された階乗を保存するなどのことを段階的に書き直して、最終的に定義に到達することで、それを効率的にする作業を開始できます。このテキストエリアの余白には収まらないかもしれませんが、そうする道はあると思います。:)

于 2012-10-05T16:59:42.470 に答える