优选法和newton法在实践中的比较

本文对比了优选法和Newton法在求解特定二次函数极值问题中的应用。通过具体的实现代码,展示了两种方法在计算效率上的差异。优选法经过19次迭代找到极值点,而改进后的Newton法仅需16次。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

优选法和newton法在实践中的比较

对于函数f(x)=2*x^2-4*x-6 ,求在(-1,2)范围内的极值,分别用优选法和newton法实践,看比较的次数。

 

(setq  count  0)

 

(defun  calc  (x)

(progn 

        (incf  count )

        (+   (*  2

                 (*  x 

                     x))

             (-  0

                 (*  4

                     x))

             (-  0

                 6))))

 

  newton

(defun  look ( mid left right  fun)

(if (< (abs (-  (funcall fun  mid ) 

                (funcall fun  left ) ))  

       (/ 1.0  10000000))

          mid

          (if  (>  (funcall fun  left ) 

                   (funcall fun  right ))

                       (look   (/  (+  mid right ) 2.0)  mid right  fun)

                       (look   (/  (+  left mid ) 2.0) left mid  fun ))))

 

//节省计算次数  ,保存局部变量

(defun  look ( mid left right leftvalue rightvalue fun)

(let  ( (midvalue  (funcall  fun  mid) ))

  (if (< (abs (-  midvalue 

                leftvalue ))  

       (/ 1.0  10000000))

          mid

          (if  (>  leftvalue 

                   rightvalue)

                       (look   (/  (+  mid right ) 2.0)  mid right midvalue rightvalue fun)

                       (look   (/  (+  left mid ) 2.0) left mid  leftvalue  midvalue fun )))))

 

       (setq  count  0)

       (print (look (/  (+  -1.0  2.0)  2)  -1.0  2.0  (calc -1.0) (calc 2.0) 'calc ))

       (print  'compare)

       (setq  count  0)

       (print (lookex 0.8  0  (/ pi  2)  0.5 'calc ))

 

没保存局部变量前为54,保存之后下降为16。

 

下面看下优选法:

(setq  golden  (/  (-  (sqrt  5) 

                       1)

                   2.0))

(defun  getright  (left right)

(+  left  

    (*  golden 

        (-  right 

            left))))

 

(defun  getleft  (left right)

(+  left  

    (*  (- 1 golden) 

        (-  right 

            left))))

 

 

(defun  look (goldenleft goldenright leftvalue rightvalue left right  fun)

(if (< (abs (-  leftvalue

                 rightvalue  ))  

       (/ 1.0  10000000))

             goldenleft

          (if  (>  leftvalue 

                   rightvalue)

                       (look   goldenright (getright goldenleft right)  rightvalue (calc (getright goldenleft right)) goldenleft right fun)

                       (look   (getleft left goldenright) goldenleft (calc (getleft left goldenright))   leftvalue  left  goldenright fun ))))

 

 

(setq  count  0)

(print (look (getleft -1.0  2.0 ) 

             (getright -1.0  2.0 ) 

             (calc (getleft -1.0  2.0 ) )  

             (calc (getright -1.0  2.0 ) ) 

             -1.0  

             2.0   

             'calc ))

 

 

[9]> count

19

从结果可以发现比较了19次才得出结果;

另外要注意,在判断终止条件的时候,两者选择的标准是不一样的,一个是以值,一个以坐标。

不过在目前的情况中是一样的,这样是为了便于与newton法比较;但在这种情况下有可能出现两者相等,但离所求的点很远的情况,(关于轴对称的情况).

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值