Advertisement
Guest User

Untitled

a guest
May 22nd, 2018
107
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Scheme 7.26 KB | None | 0 0
  1. ;-- Ableitung von Funktionen -----------------------------------------
  2.  
  3. (define ableitung
  4.   (lambda (ausdr var)
  5.     (cond
  6.       [(number? ausdr) 0]
  7.       [(symbol? ausdr) (if (eqv? ausdr var) 1 0)]
  8.       [(= (length ausdr) 2)
  9.        (let ([op (car ausdr)] [term1 (cadr ausdr)])
  10.          (case op
  11.            [(+) (list '+ (ableitung term1 var))]
  12.            [(-) (list '- (ableitung term1 var))]
  13.            [(*) (list '* (ableitung term1 var))]
  14.            [(/) (list '/ (ableitung term1 var))]
  15.            [(sqrt) (list '/ 1 (list '* 2 (list 'sqrt term1)))]
  16.            [(sqr) (list '* term1 2)]
  17.            [(exp) (list '* (list 'exp term1) (ableitung term1 var))]
  18.            [(sin) (list 'cos term1)]
  19.            [(cos) (list '* -1 (list 'sin term1))]
  20.            [(tan) (list '+  1 (list 'sqr (list 'tan term1)))]
  21.            [(log) (list '/ 1 term1)]
  22.            ;hier stehen weitere Regeln unärer Operationen
  23.            [else
  24.             'Unbekannt!]))]
  25.       [(= (length ausdr) 3)
  26.        (let ([op (car ausdr)] [term1 (cadr ausdr)] [term2 (caddr ausdr)])
  27.          (case op
  28.            [(+) (list '+ (ableitung term1 var) (ableitung term2 var))]
  29.            [(-) (list '- (ableitung term1 var) (ableitung term2 var))]
  30.            [(*) (list '+ (list '* (ableitung term1 var) term2) (list '* term1 (ableitung term2 var)))]
  31.            [(/) (list '/ (list '- (list '* (ableitung term1 var) term2) (list '* term1 (ableitung term2 var))) (list 'exp term2 2))]
  32.            [(expt) (cond
  33.                        [(x? term1) (list '* term2 (list 'expt term1 (list '- term2 1)))]
  34.                        [else (list '* (list 'expt term1 term2) (list 'log term1))])]
  35.            [(log) (list '/ 1 (list '* term1 (list 'log term2)))]
  36.            ;hier stehen weitere Regeln binärer Operationen
  37.            [else
  38.             'Unbekannt!]))]
  39.       [else
  40.        'Unbekannt!])))
  41.  
  42. (define x?
  43.   (lambda (ausdr)
  44.     (not (not (memv 'x (list ausdr))))))
  45.  
  46. ;Vereinfachungsregeln
  47. (define vereinfache
  48.   (lambda (ausdr)
  49.     (letrec
  50.         ([help-unop
  51.           (lambda (op term1)
  52.             (case op
  53.               [(+ *) (vereinfache term1)]
  54.               [(/) (list '/ 1 (vereinfache term1))]
  55.               [(sin) (cond
  56.                        [(number? term1) (sin term1)]        
  57.                        [(and (list? term1) (= (length term1) 2) (eqv? (car term1) 'asin))
  58.                         (vereinfache (cadr term1))]
  59.                        [else
  60.                         (list 'sin (vereinfache term1))])]
  61.               [(cos) (cond
  62.                        [(number? term1) (sin term1)]        
  63.                        [(and (list? term1) (= (length term1) 2) (eqv? (car term1) 'acos))
  64.                         (vereinfache (cadr term1))]
  65.                        [else
  66.                         (list 'cos (vereinfache term1))])]
  67.               [(exp) (cond
  68.                        [(and (list? term1) (= (length term1) 2) (eqv? (car term1) 'log))
  69.                         (vereinfache (cadr term1))]
  70.                        [else
  71.                         (list 'exp (vereinfache term1))])]
  72.               [(sqr) (cond
  73.                        [(and (list? term1) (= (length term1) 2) (eqv? (car term1) 'sqrt))
  74.                         (vereinfache (cadr term1))]
  75.                        [(number? term1) (sqr term1)]
  76.                        [else
  77.                         (list 'sqr (vereinfache term1))])]
  78.               [(sqrt) (cond
  79.                        [(and (list? term1) (= (length term1) 2) (eqv? (car term1) 'sqr))
  80.                         (vereinfache (cadr term1))]
  81.                        [(number? term1) (sqrt term1)]
  82.                        [else
  83.                         (list 'sqrt (vereinfache term1))])]
  84.              
  85.              
  86.              [else
  87.               (list op (vereinfache term1))]))]
  88.          [help-binop
  89.           (lambda (op term1 term2)
  90.             (case op
  91.               [(+) (cond
  92.                      [(eqv? term1 0) (vereinfache term2)]
  93.                      [(eqv? term2 0) (vereinfache term1)]
  94.                      [(equal? term1 term2) (list '* 2 (vereinfache term1))]
  95.                      [(and (number? term1) (number? term2)) (+ term1 term2)]
  96.                      [else
  97.                       (list '+ (vereinfache term1) (vereinfache term2))])]
  98.               [(*) (cond
  99.                      [(or (eqv? term1 0) (eqv? term2 0)) 0]
  100.                      [(eqv? term1 1) (vereinfache term2)]
  101.                      [(eqv? term2 1) (vereinfache term1)]
  102.                      [(equal? term1 term2) (list 'expt (vereinfache term1) 2)]
  103.                      [(and (number? term1) (number? term2)) (* term1 term2)]
  104.                      [else
  105.                       (list '* (vereinfache term1) (vereinfache term2))])]
  106.               [(-) (cond
  107.                      [(eqv? term1 0) (list '- (vereinfache term2))]
  108.                      [(eqv? term2 0) (vereinfache term1)]
  109.                      [(equal? term1 term2) 0]
  110.                      [(and (number? term1) (number? term2)) (- term1 term2)]
  111.                      [else
  112.                       (list '- (vereinfache term1) (vereinfache term2))])]
  113.               [(/) (cond
  114.                      [(eqv? term1 0) 0]
  115.                      [(eqv? term2 1) (vereinfache term1)]
  116.                      [(equal? term1 term2) 1]
  117.                      [(and (number? term1) (number? term2)) (/ term1 term2)]
  118.                      [else
  119.                       (list '/ (vereinfache term1) (vereinfache term2))])]
  120.               [(expt) (cond
  121.                      [(eqv? term1 0) 0]
  122.                      [(eqv? term2 1) (vereinfache term1)]
  123.                      [(eqv? term2 0) 1]
  124.                      [(and (number? term1) (number? term2)) (expt term1 term2)]
  125.                      [else
  126.                       (list 'expt (vereinfache term1) (vereinfache term2))])]
  127.               [(log) (cond
  128.                      [(equal? term1 term2) 1]
  129.                      [(and (number? term1) (number? term2)) (log term1 term2)]
  130.                      [else
  131.                       (list 'expt (vereinfache term1) (vereinfache term2))])]
  132.               ;hier stehen weitere Vereinfachungsregeln für binäre Operationen
  133.               [else
  134.                (list op (vereinfache term1) (vereinfache term2))]))])
  135.       (cond
  136.         [(or (number? ausdr) (symbol? ausdr)) ausdr]
  137.         [(= (length ausdr) 2) (help-unop (car ausdr) (cadr ausdr))]
  138.         [(= (length ausdr) 3)
  139.          (help-binop (car ausdr) (cadr ausdr) (caddr ausdr))]
  140.         [else
  141.          ausdr]))))
  142.  
  143. (define supervereinfache
  144.   (lambda (ausdr)
  145.     (if (equal? ausdr (vereinfache ausdr)) ausdr
  146.         (supervereinfache (vereinfache ausdr)))))
  147.  
  148. (define super
  149.   (lambda (ausdr)
  150.     (supervereinfache (ableitung ausdr 'x))))
  151.  
  152.  
  153. (super '(* (cos x) (sqrt x)))
  154.  
  155. ;(define f1-term '(+ (* 3 x) (sqr (+ 1 (sqr x)))))
  156. ;(define f1 (eval (list 'lambda '(x) f1-term)))
  157. ;(define df1-term (ableitung f1-term 'x))
  158. ;(define df1 (eval (list 'lambda '(x) df1-term)))
  159. ;f1-term
  160. ;(f1 1)
  161. ;df1-term
  162. ;(df1 -1)
  163. ;(schaubild '(f1 df1) -5 5 -20 20 '("red" "blue"))
  164.  
  165. ;(supervereinfache '(+ (* 3 4) (+ 2 0)))
  166. ;(supervereinfache '(sin 3.14))
  167. ;(supervereinfache '(sin (asin (* 2 x))))
  168. ;(ableitung '(+ (sqr x) (* 3 x)) 'x)
  169. ;(supervereinfache (ableitung '(+ (sqr x) (* 3 x)) 'x))
  170.  
  171. ;(supervereinfache '(sin (asin (* x (expt x 1)))))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement