微分方程数值解法(实际应用的改进)

来源:互联网 发布:115会员淘宝购买 编辑:程序博客网 时间:2024/05/16 10:40
 

微分方程数值解法(实际应用的改进)
延伸上面的问题
假设有这样一种情况,关于人行走的,从A到B地,行走速度越来越慢,速度是关于时间A/

(t+B)+C的函数,现在求当s和时间t的关系;
从微分的角度看,v=s'=A/(t+B)+C
采用分离变量法有:
d(s)/d(t)=A/(t+B)+C
Go
d(s)=d(t)*{A/(t+B)+C}
Go
s=A*In (t+B)+C*t+D
假设A=10,另外再假设B=1,C=2,D=100,
这样有s(0)=100;
下面看数值解法和公式解法的差异;

下面写程序来证明:
(setq  a  10)
(setq  b  1)
(setq  c  2)
(setq  d  100)


(defun pow (num count)
(if (or (> count 1) (eq  count  1) )
      (* num
         (pow num
              (- count 1) ) )
      1))

(defun slayer ( count)
(if (or (> count 1) (eq  count  1) )
      (* count
         (slayer 
              (- count 1) ) )
      1))

(defun slayerex (num count)
(if (or (> count 1) (eq  count  1) )
      (* num
         (slayerex
              (-  num  1)
              (- count 1) ) )
      1))


注意这里是关于x1的函数

(defun  expr (x1 y1 )
(+  y1
    (*  0.1
        (+ C
           (/ A
              (+  B
                  x1))))))

(defun  calc (n x)
(if  (eq  n  0)
       1.0
    (+ (calc (1- n)
             x)
       (*  (pow  x 
                 n)
           (/    1
                 (slayer n))))))
     
(defun  mysqrt (x)
(calc  10
       (*  1/2
           (log x))))

(defun  formula  (x)
(+  (*   A
         (log  (+  x
                   B)))
    (*   C
         x)
    D))


(defun  exprhelp (x1 )
(if (< (abs (-  x1  0))
       0.1)
        (formula  0)
    (expr  x1 
           (exprhelp  (-  x1 
                          0.1)))))                 

(defun  test (n)
(if (> n 99)
  (progn
       (print (exprhelp n))
       (print  'compare)
       (print (formula n))     
       (test (- n 0.1)))
  (print 'over)))

[32]> (test  100)

345.65558
COMPARE
346.15118
345.44568
COMPARE
345.94128
345.23578
COMPARE
345.73138
345.02585
COMPARE
345.52148
344.81592
COMPARE
345.31152
344.606
COMPARE
345.1016
344.39603
COMPARE
344.89163
344.18607
COMPARE
344.68167
343.9761
COMPARE
344.4717
343.7661
COMPARE
344.26172
343.55612
COMPARE
344.05173
OVER
OVER
两者的值也是非常的接近,不过这里线性关系已经占主要部分了;

 

原创粉丝点击