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

09.16
Sun
こないだのやつにsinとcosがあっても微分できるようにしてみました(

ということで今微分できる式は以下のような感じ
polynomial.png
こんな感じの多項式と、

それを引数に取るようなsin,cosの式

たとえばこんな感じの式は微分できる

dvtest1exp.png

たぶん結果は以下のやつを表すS式が返る

dvtest2exp.png

だけど、積の微分を書いてないので、sin(x)cos(x)みたいな式を微分できない(ぇ

かっすい

そして定数項を微分したときにいちいち0って結果も入れてくれる(ぇ

まぁまぁそういうことでコード



(setq funclist '(sin cos))


(defun isin (lst factor)
	(if (null lst)
		0
      	(progn
			(if (listp (car lst))
	    		(isin (car lst) factor)
	    		(progn
	      			(if (equal (car lst) factor)
		  				(+ 1 (isin (cdr lst) factor))
						(isin (cdr lst) factor)
	      			)
	    		)
			)
		)
	)
)

(defun delete-factor (lst factor)
	(if (null lst)
		nil
		(progn
			(if (not (equal (car lst) factor))
				(cons (car lst) (delete-factor (cdr lst) factor))
				(delete-factor (cdr lst) factor)
			)
		)
	)
)

(defun repeat-make (n &optional (symbolname 'x))
	(if (= n 0)
		nil
		(cons symbolname(repeat-make (- n 1) symbolname))
	)
)



(defun funcdv (expr symbolname)
	(let ((funcname (car expr)))
		(cond
			((equal funcname 'sin)
				(list '* (dv (cadr expr) symbolname) (list 'cos (cadr expr)))
			)
			((equal funcname 'cos)
				 (list '* -1 (dv (cadr expr) symbolname) (list 'sin (cadr expr)))
			)
		)
	)
)




(defun dvmult (expr symbolname)
	(if (atom expr)
		(if (equal expr symbolname) 1 0 )
		(progn
			(if (= (isin funclist (car expr) ) 0)
				(progn
					(let ((order (isin expr symbolname)))	
						(cons (car expr) (cons order (append (cdr (delete-factor expr symbolname)) (repeat-make (- order 1) symbolname))))
					)
				)
				(funcdv expr symbolname)
			)
		)
	)
)


(defun isallatom (lst)
	(if (null lst)
		t
		(if (atom (car lst))
			(isallatom (cdr lst))
			nil
		)
	)
)




(defun dv (expr &optional (symbolname 'x))
	(if	(atom expr)
		(if (equal expr symbolname)
			1
			'(0)
		)
		(progn
			(if (= (isin expr symbolname) 0)
				'(0)
				(progn
					(cond
						((equal (car expr) '+)(cons '+ (dv (cdr expr) symbolname)))
						((equal (car expr) '-)(cons '- (dv (cdr expr) symbolname)))
						((equal (car expr) '*)(dvmult expr symbolname))
						((/= (isin funclist (car expr)) 0) (dvmult expr symbolname))
						(t
							(cons (dvmult (car expr ) symbolname) (dv (cdr expr) symbolname))
						)
					)
				)
			)
		)
	)
)


S式的にはf(x)は

dvtest3exp.png

それをdvに与えてやると

こんな感じで微分された式が返ってくる

dvtest4result.png

はい。なんのこっちゃわからない

ということでf(x)とf'(x)をグラフに描いてもらってみた(functionviewerで)

dvtest4graph.png

青いのがf(x)で赤いのがf'(x)っぽい

すると、f'(x)は0で5手前くらいの値をとるっぽいので、x = 0で微分した式をevalしてみて

4.7~8位をとってくれればいいんじゃね(投げやり

ということでしてみると4.80085ってなりましたとさ

dvtestresult.png
スポンサーサイト

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