二分法求函数解
(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
具体有啥用途?
下面 有示例 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 mahuan1279 发表于 2021-8-8 11:56
_$ (defun tt()
(setq fun (lambda (x) (sin x)))
(binsea fun 1.0 10.0 0.9 0.001)
函数必须在给定范围里单调 且解必须在范围里 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 谢谢楼主分享,lisp对数学的求解我接触比较少 看起来挺有趣,但是好像看不出具体应用,开方有sqrt,asin也可以atan反求,都比二分法快上百倍的性能,不知什么情况下需要用到 本帖最后由 kkq0305 于 2021-8-8 16:03 编辑
tryhi 发表于 2021-8-8 14:54
看起来挺有趣,但是好像看不出具体应用,开方有sqrt,asin也可以atan反求,都比二分法快上百倍的性能,不知 ...
那是因为你没有用到 要用二分法求解的是复杂的方程 比如说水文方面 已知河道截面求解河道流量确定时的水深
页:
[1]