FC2ブログ
--.--
--
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

09.19
Wed
何回おんなじネタでブログ書いてんだよってはなしですが....

Lispで記号微分的なあれです

(defun diff1 (expr)
	(if (not (null expr))
		(cons (diff (car expr)) (diff1 (cdr expr)))
		nil
	)
)


(defun diff (expr &optional (symbolname 'x))
	(cond
		((null expr)
			nil
		)
		((atom expr)
			(if (equal expr symbolname)
				1
				0
			)
		)
		(t
			(let ((funcname (car expr)))
				(cond
					((or (equal funcname '+) (equal funcname '-))
						(if (= (length expr) 2)
							(if (equal funcname '-) (* (diff (cadr expr)) -1) (diff (cadr expr)))
							(cons funcname (diff1 (cdr expr)))
						)
					)
					((equal funcname '*)
						(if (= (length expr) 3)
							(list '+ (list '* (car (diff1 (cdr expr))) (caddr expr)) (list '* (cadr expr) (cadr (diff1 (cdr expr)))))
							(list '+ (list '* (diff (reverse(cdr(reverse expr)))) (car (last expr)))  (list '* (reverse(cdr(reverse expr))) (car (diff1  (last expr)))))
						)
					)
					((equal funcname '/)
						(if (= (length expr) 3)
							(list '/  (list '- (list '* (diff (cadr expr))(caddr expr)) (list '* (cadr expr) (diff (caddr expr))))(list '* (caddr expr) (caddr expr)))
							"too many args!"
						)
					)
					(t
						(cond
							((equal funcname 'sin)
								(list '* (diff (cadr expr)) (list 'cos (cadr expr)))
							) 
							((equal funcname 'cos)
								(list '* -1 (diff (cadr expr)) (list 'sin (cadr expr)))	
							)
							((equal funcname 'tan)
								(list '* (list '/ 1 (list '* (list 'cos (cadr expr)) (list 'cos (cadr expr))))(diff (cadr expr)))
							)
							((equal funcname 'sqrt)
								(list '/ (diff (cadr expr)) (list '* 2 (list 'sqrt (cadr expr))) )
							)
							((equal funcname 'log)
								(list '/ (diff (cadr expr)) (cadr expr))
							)
						)
					)
				)
			)
		)
	)
)





(print (diff '(+ (* (sin x) (cos (* 2 x))) (* x x x) (sin (cos (tan (+ (* x x) (* 5 x) 3)))))))


sin(x)cos(2x) + x^3 + sin(cos(tan(x^2+5x+3)))を微分しますー。デフォルトでxで微分します。

これあってんのかなぁ一(ぇ

というのも結果が表示されるとわかるんですけど、

大量のS式が出てきます。答え的にはあってるはずですが,

(* x 0)とか(* x 1)とかが含まれるのでめんどいことになってます.

デバッグしずらい

これを簡潔にしようとdiffが返したS式からいろいろやってたんですが、

diffをちょっと工夫したほうがかなり楽なきがしてきた...
スポンサーサイト

comment 0 trackback 0
トラックバックURL
http://telracsmoratori.blog.fc2.com/tb.php/139-b0b8c6e4
トラックバック
コメント
管理者にだけ表示を許可する
 
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。