上周科学计算引论结课了,借着写上机报告的机会,我把书本上所有的求解非线性方程的方法(标量型)都用matlab实现了一下,并对一个实际工程问题进行求解。关于实现过程中遇到的问题以及注意事项,我已写在 matlab笔记:久未使用之后踩的一堆坑 内。
实际问题
在电力系统稳定计算中,我们往往要由上式求出功率角$\theta$。我们可以使用几何方法求解,也可以利用迭代法求解该非线性方程。
我们将上式变为:
以许实章编《电机学习题集》第367页26-1为例,将$P_{em}=1$,$P_{j}=1.878$,$P_{2e}=0.75$代入,得到方程:
问题求解
几何方法
求解$\theta$即求解$f(\theta )$在$[0,\frac{\pi }{6}]$上的零点。
在matlab中,将该函数实现如下:
1 |
function [y] = func(x) |
二分法
1 |
function [errors, ans, time] = bisection(low, high, max, stopError) |
输入命令
[errorsB, ans, time] = bisection(0, pi / 6, 50, 1.7e-5)
,求得结果如下:
1 |
errorsB = |
弦截法
1 |
function [errors, ans, time] = linecut(a, b, max, stopError) |
输入命令
[errorsL, ans, time] = linecut(0, pi / 6, 50, 1.7e-5)
,求得结果如下:
1 |
errorsL = |
Steffensen方法
1 |
function [errors, ans, time] = steffensen(x, max, stopError) |
选取初始点为$0$,输入命令
[errorsS1, ans, time] = steffensen(0, 50, 1.7e-5)
,求得结果如下:
1 |
errorsS1 = |
发现计算次数没有比弦截法少,因此修改初值为$\frac{\pi }{6}$,再次计算,得结果:
1 |
errorsS2 = |
Picard迭代法
上述的方法都是基于几何图形的求解方法,而下面的Picard迭代法则是基于不动点原理给出的。
首先,我们编写迭代函数:
1 |
function [y] = interation(x) |
1 |
>> x = 0 : pi / 36 : pi / 6; |
得到:
易验证,该函数在$[0,\frac{\pi }{6}]$上满足Picard迭代条件。
Picard迭代法
1 |
function [errors, ans, time] = picard(x, max, stopError) |
输入命令
[errorsP, ans, time] = picard(0, 50, 1.7e-5)
求解:
1 |
errorsP = |
Picard迭代结果为$22.909757357777192^{\circ}$,且精度符合要求。下面使用Picard迭代法的改进Aitken加速迭代法进行试验。
Aitken加速迭代法
1 |
function [errors, ans, time] = aitken(x, max, stopError) |
输入命令
[errorsA, ans, time] = aitken(0, 50, 1.7e-5)
求解得到:
1 |
errorsA = |
可以看到,Aitken加速迭代法仅需3次迭代就得到了符合条件的解,且它的迭代误差只用$0.000000000176165$,小于上述所有的方法,由此该方法的优势得以体现。
Newton迭代法
Newton迭代法也是一种求解非线性方程的高效算法,因此我也对其进行实现。
这里要用到
func
的导数,经计算,编写
func
的导函数为程序
df
:
1 |
function [y] = df(x) |
Newton迭代法
1 |
function [errors, ans, time] = newton(x, max, stopError) |
输入命令
[errorsN, ans, time] = newton(0, 50, 1.7e-5)
进行计算,得解:
1 |
errorsN = |
Newton下山法
为尽可能避免因初值选取不当导致计算过程缓慢收敛或者发散(经上面计算,此问题不存在这种情况),引入下山因子$\lambda \in (0,1]$,得到改进后的Newton下山法,其计算程序如下:
1 |
function [errors, ans, time] = hill(x, max, stopError) |
1 |
errorsH = |
问题的解
以上方法都得到了一致的答案,根据精度要求,我们得出此条件下功率角$\theta$为$22.910^{\circ}$,与许实章编《电机学习题集》中的例题答案$22.9^{\circ}$相吻合。