Использование схемы для расчета Ньютона-Рафсона - PullRequest
1 голос
/ 06 апреля 2019

По Ньютон-Рафсону:

X n + 1 = X n - f (X n ) /f '(X n )

(newtonRhap x f fx)

(newtonRhap 0.1 sin cos) => 0

(newtonRhap 2.0 
            (lambda (x) (- (* x x) x 6))             ; f
            (lambda (x) (- (* 2 x) 1  )) ) => 3      ; f'

Как реализовать эту функцию?

Процедура остановит итерацию, если изменение в решении меньше чемзаданный допуск.

Я использую для этого глобальную переменную, (define TOL 1e-6):

#lang racket
(define TOL 1e-6)
(define (func f x) (f x))
(define (f x) (- (* x x) x 6))
(define (fx x) (- (* 2 x) 1))
(define x 2.0)
(define (newtonRhap x ff ffx)  
    ( (> (- x (/ ff ffx)) TOL)
      (newtonRhap (- x (/ ff ffx)) ff ffx)  
      (list x) ) )

(display (newtonRhap x (f x) (fx x)) )

Ответы [ 2 ]

0 голосов
/ 27 мая 2019

Во-первых, вы пропускаете if там:

(define (newtonRhap x ff ffx)
    ( <b>if</b> (> (- x (/ ff ffx)) TOL)
      (newtonRhap (- x (/ ff ffx)) ff ffx)
      (list x) ) )

Без него вы бы вызывали результат булева теста как функцию со следующими значениями двух форм в качестве аргументов (это можетработать на ленивом функциональном языке с условными кодами, закодированными Церковью, но это не главное, и Схема / Ракетка не ленива)1008 * функции , но вы рассматриваете их, как если бы они были числовыми значениями .Исправление дает нам

(define (nl x)     ; for debugging insight;
   (newline)       ; for production redefine it as
   (display x)     ;    (define (nl x) x)
   x)  

(define (newtonRhap x ff ffx)
  (let ((new-x (nl (- x (/ (ff x) (ffx x))))))  ; Follow The Formula
    ( if (> (abs (- x new-x)) TOL)             ; use abs
      (newtonRhap new-x ff ffx)          ; make next step
      (list new-x) ) ) )        ; return the new x, it's closer to the true result

Теперь мы можем запустить

(display (newtonRhap x f fx))

3.333333333333333
3.019607843137255
3.0000762951094835
3.000000001164153
3.0(3.0)
>
0 голосов
/ 25 апреля 2019

Хорошая попытка, вам нужно изменить функцию newtonRaph, чтобы использовать IF, хотя, как это

(define (newtonRhap x ff ffx)
  (if (> (- x (/ ff ffx)) TOL)
      (newtonRhap (- x (/ ff ffx)) ff ffx))
      (list x)))
...