kkq0305 发表于 2021-8-7 00:19:55

二分法求函数解

(defun binSea (fun minx maxx any pre)
(cond        ((equal (fun (* 0.5 (+ minx maxx))) any pre)
       (* 0.5 (+ minx maxx))
        )
        ((< (* (- any (fun (* 0.5 (+ minx maxx)))) (- any (fun maxx)))
          0
       )
       (binsea fun (* 0.5 (+ minx maxx)) maxx any pre)
        )
        ((< (* (- any (fun (* 0.5 (+ minx maxx)))) (- any (fun minx)))
          0
       )
       (binsea fun minx (* 0.5 (+ minx maxx)) any pre)
        )
)
)
函数名 binsea
参数
fun要求的函数名 用defun lambda 等自定义
minx maxx 求解范围最大值 最小值
any 目标值
pre 精度
说明:函数必须在给定范围里单调 且解必须在范围里
示例:求根号5
(defun tt()
(setq fun (lambda (x) (* x x)))
(binsea fun 1.0 10.0 5 0.001)
)
(tt)----->2.23596

mahuan1279 发表于 2021-8-7 14:12:39

具体有啥用途?

kkq0305 发表于 2021-8-7 15:38:39

mahuan1279 发表于 2021-8-7 14:12
具体有啥用途?

下面 有示例

mahuan1279 发表于 2021-8-8 11:56:41

kkq0305 发表于 2021-8-7 15:38
下面 有示例

_$ (defun tt()
(setq fun (lambda (x) (sin x)))
(binsea fun 1.0 10.0 0.9 0.001)
)
TT
_$ (tt)
nil

kkq0305 发表于 2021-8-8 12:51:06

mahuan1279 发表于 2021-8-8 11:56
_$ (defun tt()
(setq fun (lambda (x) (sin x)))
(binsea fun 1.0 10.0 0.9 0.001)


函数必须在给定范围里单调 且解必须在范围里

kkq0305 发表于 2021-8-8 12:53:39

mahuan1279 发表于 2021-8-8 11:56
_$ (defun tt()
(setq fun (lambda (x) (sin x)))
(binsea fun 1.0 10.0 0.9 0.001)


命令: (defun tt()
(_>   (setq fun (lambda (x) (sin x)))
(_>   (binsea fun 0.0 (* 0.5 pi) 0.9 0.001)
(_>   )
TT
命令: (tt)
1.11981
命令: (sin 1.11981)
0.900018

tigcat 发表于 2021-8-8 14:46:07

谢谢楼主分享,lisp对数学的求解我接触比较少

tryhi 发表于 2021-8-8 14:54:38

看起来挺有趣,但是好像看不出具体应用,开方有sqrt,asin也可以atan反求,都比二分法快上百倍的性能,不知什么情况下需要用到

kkq0305 发表于 2021-8-8 15:17:37

本帖最后由 kkq0305 于 2021-8-8 16:03 编辑

tryhi 发表于 2021-8-8 14:54
看起来挺有趣,但是好像看不出具体应用,开方有sqrt,asin也可以atan反求,都比二分法快上百倍的性能,不知 ...
那是因为你没有用到 要用二分法求解的是复杂的方程 比如说水文方面 已知河道截面求解河道流量确定时的水深
页: [1]
查看完整版本: 二分法求函数解