复数域内的微分解法
先考虑一个简单的微分形式y'=e^x*cos x ,
这种形式如果考虑分离变量法,需要采用两次局部积分法最后才能获得结果;但如果在复数域
内解答将会很简单,并且我们将验证采用数值解法的结果比较;
将上面形式变为复数域的形式有:
yy'=Re { e^x*e^ix}
Go
yy'=Re{e^{x(1+i)}}
GO
yy=Re {1/(1+i)*e^{x(1+i)}+C } (C为实数)
Go
yy=Re { (1-i)/2*e^{x(1+i)}+C }
Go
yy=Re { 1/2*e^x*(cos x+i*sin x) - 1/2*e^x*(i*cos x-*sin x) +C}
Go
yy=Re { 1/2*e^x*(cos x-sin x) + i/2*e^x*(sin x -cos x) +C}
回到实数领域内有:
y= 1/2*e^x*(cos x+sin x) +C
将y代入原微分方程可以获得解答;
现在假设初始条件y(0)=1,这个时候C为1/2
下面写程序来证明:
(setq c 0.5)
(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))
(setq e (calc 30 1))
(defun transform (x1)
(calc 30
(mymod x1)))
(defun mymod (x)
(/
(round x 1)
1))
(defun expr (x1 y1 )
(+ y1
(* 0.01
(* (cos x1)
(transform 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)
(+ (* 0.5
(calc 30 x)
(+ (cos x)
(sin x)))
c))
(defun exprhelp (x1 )
(if (< (abs (- x1 0))
0.001)
(formula 0)
(expr x1
(exprhelp (- x1
0.01)))))
(defun test (n)
(if (> n 0)
(progn
(print (exprhelp n))
(print 'compare)
(print (formula n))
(test (- n 1)))
(print 'over)))
[365]> (test 10)
-16685.893
COMPARE
-15231.83
-2424.1306
COMPARE
-2021.2682
1294.8411
COMPARE
1258.2537
843.1325
COMPARE
774.11414
160.25563
COMPARE
137.8181
-50.077778
COMPARE
-49.608906
-41.681297
COMPARE
-38.003887
-9.392899
COMPARE
-8.025031
2.224791
COMPARE
2.321959
2.473438
COMPARE
2.3780246
OVER
OVER
从这里可以看出误差还是有一些,不过相对已经很接近了;主要原因还是float计算能力的限
制,比如(calc 30 x)中如果x是整数是能够计算出结果的,如果是小数就不能了;
先考虑一个简单的微分形式y'=e^x*cos x ,
这种形式如果考虑分离变量法,需要采用两次局部积分法最后才能获得结果;但如果在复数域
内解答将会很简单,并且我们将验证采用数值解法的结果比较;
将上面形式变为复数域的形式有:
yy'=Re { e^x*e^ix}
Go
yy'=Re{e^{x(1+i)}}
GO
yy=Re {1/(1+i)*e^{x(1+i)}+C } (C为实数)
Go
yy=Re { (1-i)/2*e^{x(1+i)}+C }
Go
yy=Re { 1/2*e^x*(cos x+i*sin x) - 1/2*e^x*(i*cos x-*sin x) +C}
Go
yy=Re { 1/2*e^x*(cos x-sin x) + i/2*e^x*(sin x -cos x) +C}
回到实数领域内有:
y= 1/2*e^x*(cos x+sin x) +C
将y代入原微分方程可以获得解答;
现在假设初始条件y(0)=1,这个时候C为1/2
下面写程序来证明:
(setq c 0.5)
(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))
(setq e (calc 30 1))
(defun transform (x1)
(calc 30
(mymod x1)))
(defun mymod (x)
(/
(round x 1)
1))
(defun expr (x1 y1 )
(+ y1
(* 0.01
(* (cos x1)
(transform 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)
(+ (* 0.5
(calc 30 x)
(+ (cos x)
(sin x)))
c))
(defun exprhelp (x1 )
(if (< (abs (- x1 0))
0.001)
(formula 0)
(expr x1
(exprhelp (- x1
0.01)))))
(defun test (n)
(if (> n 0)
(progn
(print (exprhelp n))
(print 'compare)
(print (formula n))
(test (- n 1)))
(print 'over)))
[365]> (test 10)
-16685.893
COMPARE
-15231.83
-2424.1306
COMPARE
-2021.2682
1294.8411
COMPARE
1258.2537
843.1325
COMPARE
774.11414
160.25563
COMPARE
137.8181
-50.077778
COMPARE
-49.608906
-41.681297
COMPARE
-38.003887
-9.392899
COMPARE
-8.025031
2.224791
COMPARE
2.321959
2.473438
COMPARE
2.3780246
OVER
OVER
从这里可以看出误差还是有一些,不过相对已经很接近了;主要原因还是float计算能力的限
制,比如(calc 30 x)中如果x是整数是能够计算出结果的,如果是小数就不能了;
本文探讨了在复数域内解决微分方程的简便方法,以y'=e^x*cos x为例,通过转换到复数域简化求解过程。通过数值计算验证了解的准确性,并用Lisp程序实现计算过程,尽管存在浮点数计算精度限制导致的误差,但整体解法已非常接近实际结果。
1003

被折叠的 条评论
为什么被折叠?



