计算物理基础-解方程(组)
在解决物理问题时,我们通常引入一定数目的变量,根据已知条件建立方程、方程组,然后通过数学方法来求解。除了有求根公式的方程、线性方程组等,在多数情况下我们需要借助数值方法通过自洽迭代来处理,这里给出常用的库函数和迭代程序范例供参考。
(1)库函数roots和fsolve
对于多项式求根,先初始化系数向量c,然后用roots函数即可。这里求解域是复数,对于x^3-x-1=0有3个根,其中一个是实数根,虚部为零。

也可以用fsolve函数,对应的语法是fun = @(x) sqrt(x.^3-x-1); fsolve(fun,1),返回结果为 1.3247,只有实数根。注意fsolve(fun,1)这里的1是初值,如果用fsolve(fun,0.5)将返回结果 -0.5774,并不是方程的根,因为迭代过程和初始值是相关的。

这里p_1,p_2,x_1,x_2是4个未知数,对应x向量中4个分量,[rand,rand,rand,rand]是四个变量的初始值取了(0,1)之间的随机数,计算结果为 1.0000 1.0000 -0.5773 0.5773,是之前Gauss求积法里面待定系数的数值。
(2)牛顿法、割线法
假定在x(k+1)时得到方程的解,泰勒展开得到x(k+1)和x(k)的递推关系,注意这里需要用到f(x)的导数。对于非线性方程组,此时导数用雅可比矩阵代替,除以导数,变成求雅可比矩阵的逆。在牛顿法中,用差分形式代替导数,对应的是割线法,需要用两个初始值。

(3)复数域的求根
将函数拓展到复数域,限制实部和虚部范围都在(-2,2)之间。从任意的一点出发,通过牛顿法迭代,将演化到3个复数根之一,分别用不同的颜色表示。值得注意的是,初始值分布无法用简单的区域分割,在某些区域,两个相差很小的初值,经过迭代,可能收敛到不同的复数根,在平面上的分布有类似分形的结构。

附录:
A. 牛顿法解方程
clear
x(1)=-10;x(2)=x(1)-(x(1)^3-x(1)-1)/(3*x(1)*x(1)-1);
i=1;
while abs(x(i+1)-x(i))>0.001
i=i+1;
x(i+1)=x(i)-(x(i)^3-x(i)-1)/(3*x(i)*x(i)-1);
end
plot(x,'o-')
B. 割线法解方程
clear
x(1)=1;x(2)=2;i=2;
while abs(x(i)-x(i-1))>0.01
f(i)=x(i)^3-x(i)-1;
f(i-1)=x(i-1)^3-x(i-1)-1;
x(i+1)=x(i)-(f(i)*(x(i)-x(i-1)))/(f(i)-f(i-1));
i=i+1;
end