提高了精度和性能优化中

这个例子表明,符号数学工具箱有助于求解方程的非线性系统时,最大限度地减少错误。

此示例使用下面的符号数学工具箱功能:

  • 计算使用分析梯度梯度

  • 通过计算分析雅可比雅可比

  • 转换符号结果为使用数字功能matlabFunction

  • 分析与可视化fplot

我们的目标是找出最小的Rosenbrock函数,或所谓的“香蕉”的功能。

F X = Σ 一世 = 1 ñ / 2 1 0 0 X 2 一世 - X 2 一世 - 1 2 2 + 1 - X 2 一世 - 1 2

fplot创建两个变量的Rosenbrock函数的快速可视化

SYMSXÿ一个= 1;B = 100;F(X,Y)=(A-X)^ 2 + B *(Y-X ^ 2)^ 2
F(X,Y)=
                
                 
                  
                   
                    
                     
                      
                       
                        
                         
                          
                           
                            X
                           
                            -
                           
                            1
                          
                         
                        
                       
                      
                     
                     
                      
                       2
                     
                    
                    
                     +
                    
                     
                      
                       100
                      
                      
                      
                       
                        
                         
                          
                           
                            
                             
                              ÿ
                             
                              -
                             
                              
                               
                                X
                              
                              
                               
                                2
                              
                             
                            
                           
                          
                         
                        
                       
                       
                        
                         2
                       
                      
                     
                    
                   
                  
                  
                   (X  -  1)^ 2 + 100 *(Y  -  X ^ 2)^ 2
                 
                
fsurf(F,[ -  2 2 -1 3])视图([ -  45 50])的颜色表喷射CAXIS([0,1000])彩条

动机

“非线性方程的解析雅克比”例如,在优化工具箱使用解决同样的问题fsolve功能。在该示例中示出工作流有误的两个潜在的来源。您将需要

  1. 翻译从文本到数字代码的数学形式Rosenbrock函数和雅克比的公式。

  2. 显式计算雅可比。对于复杂的公式,这个任务是很容易出错。

这个例子表明,使用符号数学来描述问题的陈述和随后的步骤最小化甚至消除这些错误。

重写Rosenbrock函数的非线性方程组的

首先,转换Rosenbrock函数F非线性方程系统F,其中F是的梯度F

明确N = 64;X =符号('X',[N,1]);F =总和(。100 *(X(2:2:N)-x(1:2:N)^ 2)^ 2 +(1-X(1:2:N))^ 2);F =梯度(F,X);

显示前10个公式:

F(1:10)
ANS =

2 X 1 - 400 X 1 X 2 - X 1 2 - 2 200 X 2 - 200 X 1 2 2 X 3 - 400 X 3 X 4 - X 3 2 - 2 200 X 4 - 200 X 3 2 2 X - 400 X X 6 - X 2 - 2 200 X 6 - 200 X 2 2 X 7 - 400 X 7 X 8 - X 7 2 - 2 200 X 8 - 200 X 7 2 2 X 9 - 400 X 9 X 10 - X 9 2 - 2 200 X 10 - 200 X 9 2 [2 * X1 - 400 * * X1(X2 - X1 ^ 2) - 2;200 * X2 - 200 * X1 ^ 2;2 * X3 - 400 * X3 *(X4 - X3 ^ 2) - 2;200 * X4 - 200 * X3 ^ 2;2 * X5 - 400 * * X5(5233 - X5 ^ 2) - 2;200 * 5233 - 200 * X5 ^ 2;2 * X7 - 400 * * X7(X8 - X7 ^ 2) - 2;200 * X8 - 200 * X7 ^ 2;2 * X9 - 400 * * X9(×10 - ×9 ^ 2) - 2;200 * X10 - 200 * X9 ^ 2]

以匹配优化工具箱中所示的中间结果中,使用的相同的形式F

F(1:2:N)=简化(F(1:2:N)+ 2 *×(1:2:N)* F(2:2:N));F(1:2:N)= F(1:2:N)/ 2;F(2:2:N)= F(2:2:N)/ 20;

现在方程的系统是相同的:

F(1:10)
ANS =

1 - X 1 10 X 2 - 10 X 1 2 1 - X 3 10 X 4 - 10 X 3 2 1 - X 10 X 6 - 10 X 2 1 - X 7 10 X 8 - 10 X 7 2 1 - X 9 10 X 10 - 10 X 9 2 〔1 - X 1;10 * X2 - 10 * X1 ^ 2;1 - X3;10 * X4 - 10 * X3 ^ 2;1 - X5;10 * 5233 - 10 * X5 ^ 2;1 - X7;10 * X8 - 10 * X7 ^ 2;1 - X9;10 * X10 - 10 * X9 ^ 2]

矩阵计算雅可比代表方程组的

雅可比计算的雅可比F。此函数计算雅可比符号,从而避免与衍生物的数值近似相关的误差。

JF =雅可比(F,X);

显示前10行和列的雅可比矩阵。

JF(1:10,1:10)
ANS =

- 1 0 0 0 0 0 0 0 0 0 - 20 X 1 10 0 0 0 0 0 0 0 0 0 0 - 1 0 0 0 0 0 0 0 0 0 - 20 X 3 10 0 0 0 0 0 0 0 0 0 0 - 1 0 0 0 0 0 0 0 0 0 - 20 X 10 0 0 0 0 0 0 0 0 0 0 - 1 0 0 0 0 0 0 0 0 0 - 20 X 7 10 0 0 0 0 0 0 0 0 0 0 - 1 0 0 0 0 0 0 0 0 0 - 20 X 9 10 [-sym(1),符号(0),符号(0),符号(0),符号(0),符号(0),符号(0),符号(0),符号(0),符号(0);-20 * X1,符号(10),符号(0),符号(0),符号(0),符号(0),符号(0),符号(0),符号(0),符号(0);符号(0),符号(0),-sym(1),符号(0),符号(0),符号(0),符号(0),符号(0),符号(0),符号(0);符号(0),符号(0),-20 * X3,符号(10),符号(0),符号(0),符号(0),符号(0),符号(0),符号(0);符号(0),符号(0),符号(0),符号(0),-sym(1),符号(0),符号(0),符号(0),符号(0),符号(0);符号(0),符号(0),符号(0),符号(0),-20 * X5,符号(10),符号(0),符号(0),符号(0),符号(0);符号(0),符号(0),符号(0),符号(0),符号(0),符号(0),-sym(1),符号(0),符号(0),符号(0);符号(0),符号(0),符号(0),符号(0),符号(0),符号(0),-20 * X7,符号(10),符号(0),符号(0);符号(0),符号(0),符号(0),符号(0),符号(0),符号(0),符号(0),符号(0),-sym(1),符号(0);符号(0),符号(0),符号(0),符号(0),符号(0),符号(0),符号(0),符号(0),-20 * X9,符号(10)]

大部分的雅可比矩阵的元素JF是零。然而,当你这个矩阵转换为MATLAB功能时,结果是致密的数值矩阵。通常情况下,在稀疏矩阵操作比在密集矩阵相同的操作更有效率。

因此,为了创建有效的代码,只转换的非零元素JF于调用​​matlabFunction前一个符号矢量。JS代表的稀疏图案JF

[被,JS =找到(JF);JF = JF(JF〜= 0);

转换方程和雅可比的系统的功能的MATLAB

方程组F,代表Rosenbrock函数,是一个由符号表达式的符号矩阵。为了能够与解决它fsolve功能,这个系统转换成MATLAB功能。在这一步,这是双方方便的转换F和它的行列,JF,到一个单一的基于文件的MATLAB功能,FJFfun。原则上,这使得FJF重用变量。或者,也可以将它们转换为单一的MATLAB功能。

matlabFunction([F; JF]“变种”,X,'文件''FJFfun');

FJFfun接受变量列表,但fsolve预计的变量的矢量。功能genericObj转换矢量到列表中。匿名函数bananaObj被定义为固定的参数值genericObj。请注意,在功能使用稀疏模式的genericObj。此外应注意,这种方法使用FJFfungenericObj一起是不依赖于特定的表达式来表示通过F并且可被用作为任何F

bananaobj = @(Y)genericObj(Y,@ FJFfun,是,JS)
bananaobj =与价值function_handle:@(y)的genericObj(Y,@ FJFfun,是,JS)

使用fsolve数值求解非线性方程组的系统

fsolve为方程系统,转换为MATLAB函数。使用的起点X(ⅰ)= -1.9为奇数索引,并且X(1)= 2为偶数索引。组'显示''ITER'看到求解的进步。组“雅可比”'上'使用中所定义的雅可比bananaobj

X0(1:N,1)= -1.9;X0(2:2:N,1)= 2;选项= optimoptions(@fsolve,'显示''ITER'“雅可比”'上');[SOL1,FSOL,exitflag,输出,JAC] = fsolve(bananaobj,X0,选项);
一阶信托区域迭代函数功能计数F(X)步骤最优半径的范数0 1 8563.84 615 1 1 2 3093.71 1 329 1 2 3 225.104 2.5 34.8 2.5 3 4 212.48 6.25 34.1 6.25 4 5 212.48 6.25 34.1 6.25 5 6212.48 1.5625 34.1 1.56 6 7 116.793 0.390625 5.79 0.391 7 8 109.947 0.390625 0.753 0.391 8 9 99.4696 0.976563 1.2 0.977 9 10 83.6416 2.44141 7.13 2.44 10 11 77.7663 2.44141 9.94 2.44 11 12 77.7663 2.44141 9.94 2.44 12 13 43.013 0.610352 1.38 0.61 13 14 36.4334 0.6103521.58 0.61 14 15 34.1448 1.52588 6.71 1.53 15 16 18.0108 1.52588 4.91 1.53 16 17 8.48336 1.52588 3.74 1.53 17 18 3.74566 1.52588 3.58 1.53 18 19 1.46166 1.52588 3.32 1.53 19 20 0.29997 1.24265 1.94 1.53 20 21 0 0 0.0547695 1.53方程求解。fsolve完成,因为函数值的向量是零附近由函数公差的值测定,如通过测定梯度的问题出现有规律的。

使用vpasolve数值求解非线性方程组的系统

非线性方程系统,F,可以用可替换地解决vpasolve功能,这是在符号数学工具箱中可用数值求解。之间的主要差异vpasolvefsolve就是它fsolve使用双精度算术解方程,而vpasolve采用可变精度运算,因此,可以让你控制计算精度。

SOL2 = vpasolve(F);

如果一个方程组的解分配给一个变量,SOL2, 然后vpasolve返回一个结构阵列的形式的万博 尤文图斯解决方案。可以访问各溶液(结构阵列的每个场):

sol2.x1
ANS =
                 
                  
                   
                    
                     1.0
                   
                   
                    VPA( '1.0')
                  
                 

你也可以转换SOL2到的符号向量,然后访问的范围内的解决方案。万博 尤文图斯例如,显示5日至25日的解决方案:万博 尤文图斯

对于K =(1:64)sol2_array(K)= SOL2(炭(X(k))的)。结束sol2_array(5:25)
ANS =
                 
                  
                   
                    
                     
                     
                      
                       
                        
                         
                          1.0
                        
                       
                       
                        
                         
                          1.0
                        
                       
                       
                        
                         
                          1.0
                        
                       
                       
                        
                         
                          1.0
                        
                       
                       
                        
                         
                          1.0
                        
                       
                       
                        
                         
                          1.0
                        
                       
                       
                        
                         
                          1.0
                        
                       
                       
                        
                         
                          1.0
                        
                       
                       
                        
                         
                          1.0
                        
                       
                       
                        
                         
                          1.0
                        
                       
                       
                        
                         
                          1.0
                        
                       
                       
                        
                         
                          1.0
                        
                       
                       
                        
                         
                          1.0
                        
                       
                       
                        
                         
                          1.0
                        
                       
                       
                        
                         
                          1.0
                        
                       
                       
                        
                         
                          1.0
                        
                       
                       
                        
                         
                          1.0
                        
                       
                       
                        
                         
                          1.0
                        
                       
                       
                        
                         
                          1.0
                        
                       
                       
                        
                         
                          1.0
                        
                       
                       
                        
                         
                          1.0
                        
                       
                      
                     
                     
                    
                   
                   
                    [VPA( '1.0'),VPA( '1.0'),VPA( '1.0'),VPA( '1.0'),VPA( '1.0'),VPA( '1.0'),VPA( '1.0'),VPA( '1.0'),VPA( '1.0'),VPA( '1.0'),VPA( '1.0'),VPA( '1.0'),VPA( '1.0'),VPA( '1.0'),VPA( '1.0'),VPA( '1.0'),VPA( '1.0'),VPA( '1.0'),VPA( '1.0'),VPA( '1.0'),VPA( '1.0')]
                  
                 

辅助函数

功能[F,J] = genericObj(X,FJFfun,是,JS)%genericObj作为输入,向量x,功能和雅可比评价%功能句柄FJFfun,以及稀疏模式是,JS并返回作为输出,%的作用与雅可比行列式的数值:F和J函数%FJS(1:长度(X))是该函数的数值向量%FJS(长度(x)的1:结束)为雅可比的非零项的数值向量XCELL = num2cell(X);FJS = FJFfun(XCELL {:});F = FJS(1:长度(X));J =稀疏(是,JS,FJS(长度(x)的1:结束));结束

版权©2016年MathWorks公司