(define pi 3.141592653589793238462643)

; DE変換

; (define (f x) (/ 1 (expt (+ x 1) 2)))
; こんな関数を、xについて0からinfinityまで積分すると、
; 解析的に 1 に値を定めることがわかる.

; 複数台形則によって数値計算するのが(J_x h) でhはその
; 幅.(幅じゃなくて分割数を引数にするべきだった)
; 普通にやると収束が遅い.

; DE変換とは、数式の上では単なる変数変換であり、
; xを(phi t)に置き換える.そうすると積分範囲と、後ろに
; dt/dxみたいなのがくっつく.それをやって台数則するのが
; (J h)であり、収束があっというまだ.

(define (phi t)
    (exp (* pi 0.5 (sinh t))))

(define (dtdx t)
    (* pi 0.5 (exp (* pi 0.5 (sinh t))) (cosh t)))


(define (f t)
    (/ 1 (expt (+ (phi t) 1) 2)))

(define (J h)
    (let ((N 6))
    (let loop ((t (- N)) (sum 0.0))
        (if (>= t N) (* sum h)
            (loop (+ t h) (+ sum (* (f t) (dtdx t) )))))))

(define (main*)
    (let loop ((h 0.0001))
        (if (> h 1) (newline)
            (begin
            (display h)(display " ")
            (display (abs (- (J h) (J (/ h 2)) )))(newline)
            (loop (* h 2))))))
(main*)

;  (J h)のxで積分するバージョン
  (define (J_x h)
      (define (f_x x)
          (let ((ret (/ 1 (expt (+ x 1) 2))))
                (if (= x 0.0) (/ ret 2) ret)))
      (let ((N 60))
      (let loop ((x 0) (sum 0.0))
          (if (>= x N) (* sum h)
              (loop (+ x h) (+ sum (f_x x)))))))

(define (main_x)
    (let loop ((h 0.0001))
        (if (> h 1) (newline)
            (begin
            (display h)(display " ")
            (display (abs (- (J_x h) (J_x (/ h 2)) )))(newline)
            (loop (* h 2))))))
;(main_x)