具有雅可比矩阵稀疏模式的大型非线性方程组
这个例子展示了如何提供一个雅可比稀疏模式来有效地求解一个大的稀疏方程组。该示例使用了为系统定义的目标函数n方程,
要解的方程是
,
.该示例使用
.的nlsf1a
的辅助功能此示例结束实现目标函数
.
在这个例子中具有雅可比矩阵的大型稀疏非线性方程组时,目标函数具有显式的雅可比矩阵。然而,有时你不能显式地计算雅可比矩阵,但你可以确定雅可比矩阵的哪些元素是非零的。在这个例子中,雅可比矩阵是三对角线的,因为唯一出现在定义中的变量 是 , , .雅可比矩阵中唯一的非零部分是在主对角线和相邻的对角线上。雅可比矩阵稀疏模式是一个矩阵,它的非零元素对应雅可比矩阵中的(潜在的)非零元素。
创建一个稀疏的
——- - - - - -
表示雅可比矩阵稀疏模式的三对角矩阵。(有关此代码的解释,请参见spdiags
.)
N = 1000;E = ones(n,1);Jstr = spdiags([e e e],-1:1,n,n);
查看结构Jstr
.
间谍(Jstr)
集fsolve
选项来使用“信赖域”
算法,这是唯一的fsolve
可以使用雅可比矩阵稀疏模式的算法。
选项= optimoptions(“fsolve”,“算法”,“信赖域”,“JacobPattern”, Jstr);
设定起始点x0
到有-1个元素的向量。
X0 = -1*ones(n,1);
解决问题。
[x,fval,exitflag,output] = fsolve(@nlsf1a,x0,options);
方程解决。Fsolve完成了,因为函数值的向量通过函数公差的值测量接近于零,并且通过梯度测量问题看起来是规则的。
检验得到的残差范数和函数求值的个数fsolve
需要。
disp(规范(fval))
1.0522 e-09
disp (output.funcCount)
25
残差范数接近于零,表明fsolve
正确地解决了问题。函数求值的数量相当少,大约只有24个。将此数量的函数求值与没有提供雅可比矩阵稀疏模式的函数求值进行比较。
选项= optimoptions(“fsolve”,“算法”,“信赖域”);[x,fval,exitflag,output] = fsolve(@nlsf1a,x0,options);
方程解决。Fsolve完成了,因为函数值的向量通过函数公差的值测量接近于零,并且通过梯度测量问题看起来是规则的。
disp(规范(fval))
1.0659 e-09
disp (output.funcCount)
5005
该求解器得到了与以前相同的解,但需要进行数千次函数求值。
Helper函数
此代码创建nlsf1a
helper函数。
函数F = nlsf1a(x)求向量函数N =长度(x);F = 0 (n,1);I = 2:(n-1);F(i) = (3-2*x(i)).*x(i)-x(i-1)-2*x(i+1) +1;F(n) = (3-2*x(n)).*x(n)-x(n-1) + 1;F(1) = (3-2*x(1)).*x(1)-2*x(2) + 1;结束