马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
本帖最后由 高山流水 于 2013-10-6 18:28 编辑
大家好!
很久以前就在想:用LISP写一个求解最优化的通用函数,因为LISP语言本身就比较适合;基于对数学的弱弱了解,写了个粗糙的函数和大家讨论,希望您能多参与这个话题,感谢在先!
用到的函数 - ;;; Used function
- (defun ss-set (ss_set_str_lst ss_set_lst / ss_set_i)
- (setq ss_set_i 0)
- (repeat (length ss_set_lst)
- (set (read (nth ss_set_i ss_set_str_lst))
- (nth ss_set_i ss_set_lst))
- (setq ss_set_i (1+ ss_set_i))))
- ;;-----------------------------
- (defun ch-lst (new i lst / j len fst mid)
- (if (/= (type i) (quote list))
- (cond
- ((not (listp lst))
- lst)
- ((minusp i) lst)
- ((> i (setq len (length lst))) lst)
- ((> i (/ len 2))
- (reverse (ch-lst new (1- (- len i)) (reverse lst))))
- (t
- (append
- (progn
- (setq fst nil)
- (repeat (rem i 4)
- (setq fst (cons (car lst) fst)
- lst (cdr lst)))
- (repeat (/ i 4)
- (setq fst (vl-list* (cadddr lst)
- (caddr lst)
- (cadr lst)
- (car lst)
- fst)
- lst (cddddr lst)))
- (reverse fst))
- (list new)
- (cdr lst))))
- (progn
- (setq j (cadr i)
- i (car i))
- (if j
- (progn
- (setq mid (nth i lst)
- mid (ch-lst new j mid))
- (ch-lst mid i lst))
- (ch-lst new i lst)))))
应用例子1:求10(x1+x2-5)^2+(x1-x2)^2的极小点和极小值,理论解: ((2.5 2.5) 0)
 - (defun val ()
- ;; 10(x1+x2-5)^2+(x1-x2)^2
- (+ (* 10. (expt (+ x1 x2 -5.) 2)) (expt (- x1 x2) 2)))
- (defun con () T)
- (setq arg (list "x1" "x2")
- arg_limit nil
- eps 1e-6)
- (Powell val con arg arg_limit eps);;->((2.5 2.5) 1.32989e-011)
应用例子2:求60-10x1-4x2+x1^2+x2^2-x1x2的极小点和极小值,理论解:((8 6) 8)
 - (defun val ()
- ;;60-10x1-4x2+x1^2+x2^2-x1x2
- (+ 60. (* -10. x1) (* -4. x2) (* x1 x1) (* x2 x2) (* -1. x1 x2)))
- (defun con () T)
- (setq arg (list "x1" "x2")
- arg_limit nil
- eps 1e-6)
- (Powell val con arg arg_limit eps);;->((8.0 6.0) 8.0)
|