明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 8289|回复: 17

[【高飞鸟】] 【飞鸟集】用LISP求积分

  [复制链接]
发表于 2010-8-8 23:38:00 | 显示全部楼层 |阅读模式

 

这几天由一个网友的问题编写了一个通用的求积分的程序。

这个求积分的程序具有较高的效率。

 

另外参考了飞诗的字符表达式转lisp表达式的程序,在此深表感谢

命令: ccc

建议加载那个vlx文件,这样更快。

 

如果你需要改造该程序,敬请说明出处。

如果你有好的建议或者算法,欢迎email联系我,我很高兴与你探讨。

 

希望网友在有时候能用得着这个程序。

数值积分1.lsp



   1.;;;用各种方法求积分的程序
   2.;;;主程序
   3.(vl-load-com)
   4.;;(arxload "geomcal.arx")
   5.(prompt "请输入CCC命令!")
   6.(defun C:ccc (/ F ID N OK X1 X2)
   7.  (setq id (load_dialog "integration.dcl"))
   8.  (setq ok 2)
   9.  (if (new_dialog "dcl_Integration" id)
 10.    (progn
 11.      (action_tile "F" "(setq f $value)") 			;从对话框中得到表达式
 12.      (action_tile "X1" "(setq x1 (myread $value))")		;从对话框中得到下届
 13.      (action_tile "X2" "(setq x2 (myread $value))")		;从对话框中得到上届
 14.      (action_tile "N" "(setq n (myread $value))") 		;从对话框中得到精度
 15.      (action_tile "help" "(choose 1)")				;帮助
 16.      (action_tile "S1" "(Read_DLg_Data x1 x2 n f \"S1\")")
 17.      (action_tile "S2" "(Read_DLg_Data x1 x2 n f \"S2\")")
 18.      (action_tile "S3" "(Read_DLg_Data x1 x2 n f \"S3\")")
 19.      (action_tile "S4" "(Read_DLg_Data x1 x2 n f \"S4\")")
 20.      (setq ok (start_dialog))
 21.    )
 22.  )
 23.  (unload_dialog ID)
 24.  (princ)
 25.)
 26.;;;读数据并求解
 27.(defun Read_DLg_Data (x1 x2 n f key / EPS RET T0 E)
 28.  (if (and x1 x2 n f)
 29.    (progn
 30.      (if (> n 20)
 31.	(setq n 20)
 32.      )
 33.      (setq e (exp 1))
 34.      (setq f (trans_format f))
 35.      (eval (list 'defun 'func (list 'x) f))
 36.      (setq eps (expt 0.1 n))
 37.
 38.      (setq t0 (getvar "TDUSRTIMER"))
 39.      (cond
 40.	((= key "S1")
 41.	 (setq ret (rtos (romberg x1 x2 eps) 2 20))
 42.	 (set_tile "R1" ret)
 43.	 (princ "\n龙贝格积分法为:")
 44.	)
 45.	((= key "S2")
 46.	 (setq ret (rtos (simpson x1 x2 eps) 2 20))
 47.	 (set_tile "R2" ret)
 48.	 (princ "\n辛普森积分法为:")
 49.	)
 50.	((= key "S3")
 51.	 (setq ret (rtos (Atrapezia x1 x2 1e-4 eps) 2 20))
 52.	 (set_tile "R3" ret)
 53.	 (princ "\n自适应积分法为:")
 54.	)
 55.	((= key "S4")
 56.	 (setq ret (rtos (Trapezia x1 x2 eps) 2 20))
 57.	 (princ "\n变步长积分法为:")
 58.	 (set_tile "R4" ret)
 59.	)
 60.      )
 61.      (princ ret)
 62.      (princ "\n用时:")
 63.      (princ (* (- (getvar "TDUSRTIMER") t0) 86400))
 64.      (princ "秒")
 65.      (princ)
 66.    )
 67.    (alert "无效的输入或有空输入!")
 68.  )
 69.)
 70.(defun myread (str / e)
 71.  (setq e (exp 1))
 72.  (eval (trans_format str))
 73.)
 74.;;;帮助说明函数
 75.(defun choose (n)
 76.  (if (= n 1)
 77.    (alert
 78.    "方程式只接受x(小写)为变量,不规范很可能出错!
 79.    "\n龙贝格效率最高,变步长法效率最低(慎用).
 80.       "\n建议不要开始把精度设置很高,特别对于变步长法.
 81.    " \n程序采用多种方法求积,不保证每个方程都有效!
 82.	 "\n有什么问题email: highflybird@qq.com"
 83.    )
 84.    (set_tile "error" "方程式只接受x(小写)为变量.")
 85.  )
 86.)
 87.;;;用方式1定义表达式求值函数
 88.(defun func1 (x)
 89.  (cal f)
 90.)
 91.;;; 龙贝格积分法
 92.(defun Romberg (a b eps / EP H I K M N P Q S X Y Y0)
 93.  (setq h (- b a))
 94.  (setq y nil)
 95.  (setq i 0)
 96.  (repeat 20
 97.    (setq y (cons (cons i 0.0) y))
 98.    (setq i (1+ i))
 99.  )
 100.  (setq y (reverse y))
 101.  (setq y0 (* h (+ (func a) (func b)) 0.5))
 102.  (setq y (cons (cons 0 y0) (cdr y)))
 103.  (setq	m  1
 104.	n  1
 105.	ep (1+ eps)
 106.  )
 107.  (while (and (>= ep eps) (<= m 19))
 108.    (setq p 0.0)
 109.    (setq i 0)
 110.    (repeat n
 111.      (setq x (+ a (* (+ i 0.5) h)))
 112.      (setq p (+ p (func x)))
 113.      (setq i (1+ i))
 114.    )
 115.    (setq p (/ (+ (cdar y) (* h p)) 2.0))
 116.    (setq s 1.0)
 117.    (setq k 1)
 118.    (repeat m
 119.      (setq s (+ s s s s))
 120.      (setq q (/ (- (* s p) (cdr (assoc (1- k) y))) (1- s)))
 121.      (setq y (subst (cons (1- k) p) (assoc (1- k) y) y))
 122.      (setq p q)
 123.      (setq k (1+ k))
 124.    )
 125.    (setq ep (abs (- q (cdr (assoc (1- m) y)))))
 126.    (setq m (1+ m))
 127.    (setq y (subst (cons (1- m) q) (assoc (1- m) y) y))
 128.    (setq n (+ n n))
 129.    (setq h (/ h 2.0))
 130.  )
 131.  q
 132.)
 133.;;; 辛普森积分法
 134.(defun Simpson (a b eps / EP H ITER K N P S1 S2 T1 T2 X)
 135.  (setq n 1)
 136.  (setq h (- b a))
 137.  (setq t1 (* h (+ (func a) (func b)) 0.5))
 138.  (setq s1 t1)
 139.  (setq ep (1+ eps))
 140.  (setq iter 0)
 141.  (while (and (>= ep eps) (< iter 100))
 142.    (setq p 0.0)
 143.    (setq k 0)
 144.    (repeat n
 145.      (setq x (+ a (* (+ k 0.5) h)))
 146.      (setq p (+ p (func x)))
 147.      (setq k (1+ k))
 148.    )
 149.    (setq t2 (/ (+ t1 (* h p)) 2.))
 150.    (setq s2 (/ (- (* 4.0 t2) t1) 3.))
 151.    (setq ep (abs (- s2 s1)))
 152.    (setq t1 t2)
 153.    (setq s1 s2)
 154.    (setq n (+ n n))
 155.    (setq h (/ h 2))
 156.    (setq iter (1+ iter))
 157.  )
 158.  s2
 159.)
 160.;;; 变步长梯形求积分法
 161.(defun Trapezia	(a b eps / H K N P S T1 T2 X iter)
 162.  (setq n 1)
 163.  (setq h (- b a))
 164.  (setq t1 (* h (+ (func a) (func b)) 0.5))
 165.  (setq p (1+ eps))
 166.  (setq iter 0)
 167.  (while (and (>= p eps) (< iter 100))
 168.    (setq s 0)
 169.    (setq k 0)
 170.    (repeat n
 171.      (setq x (+ a (* (+ k 0.5) h)))
 172.      (setq s (+ s (func x)))
 173.      (setq k (1+ k))
 174.    )
 175.    (setq t2 (/ (+ t1 (* h s)) 2.))
 176.    (setq p (abs (- t1 t2)))
 177.    (setq t1 t2)
 178.    (setq n (+ n n))
 179.    (setq h (/ h 2))
 180.    (setq iter (1+ iter))
 181.  )
 182.  t2
 183.)
 184.;;; 步长积分法
 185.(defun trapzd (a b n / DEL IT SUM TNM X)
 186.  (if (= n 1)
 187.    (setq s (* 0.5 (- b a) (+ (func a) (func b))))
 188.    (progn
 189.      (setq it 1)
 190.      (repeat (- n 2)
 191.	(setq it (lsh it 1))
 192.      )
 193.      (setq tnm it)
 194.      (setq del (/ (- b a) tnm))
 195.      (setq x (+ a (* 0.5 del)))
 196.      (setq sum 0.0)
 197.      (repeat it
 198.	(setq sum (+ sum (func x)))
 199.	(setq x (+ x del))
 200.      )
 201.      (setq s (* 0.5 (+ s (/ (* (- b a) sum) tnm))))
 202.    )
 203.  )
 204.)
 205.
 206.;;; 自适应求积分法
 207.(defun Atrapezia (a b d eps / F0 F1 H S T0 TT)
 208.  (setq h (- b a))
 209.  (setq TT '(0. . 0.))
 210.  (setq f0 (func a))
 211.  (setq f1 (func b))
 212.  (setq t0 (* h (+ f0 f1) 0.5))
 213.  (setq s (car (ppp a b h f0 f1 t0 eps d tt)))
 214.)
 215.(defun PPP (x0 x1 h f0 f1 t0 eps d tt / EPS1 EPS2 F G P T1 T2 T3 X X2)
 216.  (setq x (+ x0 (* h 0.5)))
 217.  (setq f (func x))
 218.  (setq t1 (* h (+ f0 f) 0.25))
 219.  (setq t2 (* h (+ f1 f) 0.25))
 220.  (setq p (abs (- t0 t1 t2)))
 221.  (if (or (< p eps) (< (* 0.5 h) d))
 222.    (cons (+ (car tt) t1 t2) (cdr tt))
 223.    (progn
 224.      (setq g (* h 0.5))
 225.      (setq eps1 (/ eps 1.4))
 226.      (setq t3 (ppp x0 x g f0 f t1 eps1 d tt))
 227.      (setq t3 (ppp x x1 g f f1 t2 eps1 d t3))
 228.    )
 229.  )
 230.)

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x

评分

参与人数 2明经币 +1 金钱 +10 收起 理由
tigcat + 10 很给力!
叮咚 + 1 很给力!

查看全部评分

"觉得好,就打赏"
    共1人打赏

本帖被以下淘专辑推荐:

发表于 2019-7-8 23:58:49 | 显示全部楼层

关于我的积分程序,已经做了重大更新,截图如上。但现在暂不提供源码。
此截图中,你会说为何有的值不一样,那你得首先了解一下积分和这类型的积分是什么含义。在此恕不解答。
龙贝格积分普遍有效,高斯勒让德也是,而且高斯勒让德法更高效。但对于某些特殊积分,就需要用到下面的方法,譬如广义积分,椭圆积分等。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
发表于 2022-4-4 22:23:34 | 显示全部楼层
支持高飞大神,说实在的,那些积分干什么用的真不知道,也不知道何时会用到.
发表于 2019-7-9 09:43:51 | 显示全部楼层
谢谢楼主分享,
发表于 2010-8-9 08:56:00 | 显示全部楼层
照旧收藏潜力贴!!!!!!!!!!!!!!沙发一下!
发表于 2010-12-9 17:13:39 | 显示全部楼层
支持原創!!!!
发表于 2011-3-25 11:37:10 | 显示全部楼层
支持原創!!!!
发表于 2011-3-25 18:17:58 | 显示全部楼层
本帖最后由 yoyoho 于 2011-3-25 18:19 编辑

感谢highflybir版主
分享程序,谢谢你 !
发表于 2011-4-18 21:59:36 | 显示全部楼层
收藏学习一下啦,支持原創!!!!
发表于 2011-11-26 21:17:52 | 显示全部楼层
ok!,cad的功能越来越大
发表于 2011-11-26 22:27:06 | 显示全部楼层
谢谢楼主,收藏了
发表于 2013-2-1 15:37:43 | 显示全部楼层
发表于 2013-2-1 16:30:30 | 显示全部楼层
最近班主一直在研究算法,支持一个!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-25 05:33 , Processed in 0.177741 second(s), 32 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表