- ;;;利用不动点迭代法求解非线性方程
- (defun c:bdd (/ EPS EXPR I X X0 X1 X2)
- (setq expr (getstring "\n输入字符串表达式:" ))
- (CAL:Expr2Func expr 'func '(x))
- (initget 1)
- (setq x1 (getreal "\n下:"))
- (initget 1)
- (setq x2 (getreal "\n上:"))
- (setq i 0)
- (setq eps 1e-14)
- (if (> x1 x2)
- (setq x0 x2)
- (setq x0 x1)
- )
- (setq x (func x0))
- (while (and ( (abs (- x x0)) eps))
- (setq x0 x)
- (setq x (func x0))
- (setq i (1+ i))
- )
- (princ "\n方程的解是: ")
- (princ (rtos x0 2 20))
- (princ "\t方程的值是: ")
- (princ (rtos x 2 20))
- (princ "\t迭代次数: ")
- (princ i)
- (princ)
- )
此段程序需要加载我的表达式求值的子程序,包含在附件里面。
当然,读者还可以按照自己的要求进一步完善,利用它,基本能解决你遇到的大多数问题。
五、延伸
不动点迭代不仅可以对实函数迭代,还可以进行复函数迭代。还有其它形式的不动点迭代。
也许你可能会发现,对于某些函数,利用不动点迭代法,可能根本不收敛,为什么呢?可能要涉及到高深的数学知识了。
另外,不动点迭代可能不只是一个不动点,可以由一个不动点,跳到另一个不动点,对某一类迭代来说,可能有多个不动点。
譬如分形,典型的例子如Mandelbrot分形,Julia分形,都存在多个不动点。
这里面牵涉到的东西用数学分析起来,太复杂了,恐怕连现在的数学家也没完全弄清楚。
下面有一个视频介绍:
好了,暂时介绍到这里。本人水平有限,文中错误请大家多多指正。
那么,你还有一些一两行就能干成大事的代码呢?不妨分享给大家,谢谢!
本帖以下内容被隐藏保护;需要你回复后,才能看到!
游客,如果您要查看本帖隐藏内容请
回复