一类非线形差分方程的解法(中间增量的形式改变)
设(n+1)*a(n)=n*a(n-1)+4*(n+1) { a(1)=2 }
设置b(n)=(n+1)*a(n) b(1)=2*a(1)=4
Go
b(n)=b(n-1)+4*(n+1)
GO
b(n)=2*(n^2+3*n-2)
Go
a(n)=b(n)/(n+1)=2*(n^2+3*n-2)/(n+1)
下面也可以写代码测试:
(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 expr (n)
(if (eq n 1)
2.0
(/ (+ (* n
(expr (1- n)))
(* 4
(1+ n)))
(1+ n))))
(defun formula (n)
(* 2.0
(/ (+ (* n n)
(* 3.0 n)
-2)
(1+ n))))
(defun test (n)
(if (> n 0)
(progn
(print (expr n))
(print 'compare)
(print (formula n))
(test (- n 1)))
(print 'over)))
(test 30)
在这种情况下,稍微改变了形式,将变为不是整数了,但其中算法时间复杂度总体还是线形的。
如果这里将初始值变为a(1)=4,将又会变为整形线形的,请问这是为什么?
(defun expr (n)
(if (eq n 1)
6.0
(/ (+ (* n
(expr (1- n)))
(* 4
(1+ n)))
(1+ n))))
(defun formula (n)
(* 2.0
(+ n 2)))
最终的奥秘在于解方程中,代数方程的特征;