改善优化中的准确性和性能

此示例演示了符号数学工具箱有助于最小化求解非线性系统的方程式时的错误。

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

目标是找到最低限度rosenbrock功能,或所谓的“香蕉”功能。

F X = σ. 一世 = 1 N / 2 1 0. 0. X 2 一世 - X 2 一世 - 1 2 2 + 1 - X 2 一世 - 1 2

Fplot.要快速可视化两个变量的RosenBrock函数

Syms.Xya = 1;B = 100;f(x,y)=(a-x)^ 2 + b *(y-x ^ 2)^ 2
f(x,y)=
                
                 
                  
                   
                    
                     
                      
                       
                        
                         
                          
                           
                            X
                           
                            -
                           
                            1
                          
                         
                        
                       
                      
                     
                     
                      
                       2
                     
                    
                    
                     +
                    
                     
                      
                       100.
                      
                      
                      
                       
                        
                         
                          
                           
                            
                             
                              y
                             
                              -
                             
                              
                               
                                X
                              
                              
                               
                                2
                              
                             
                            
                           
                          
                         
                        
                       
                       
                        
                         2
                       
                      
                     
                    
                   
                  
                  
                   (x  -  1)^ 2 + 100 *(y  -  x ^ 2)^ 2
                 
                
FSURF(F,[ -  2 2 -1 3])视图([ -  45 50])Colormap喷射Caxis([0,1000])彩色键

动机

“具有分析雅可比的非线性方程”优化工具箱中的示例通过使用使用的问题FSOLVE.功能。该示例中显示的工作流有两个潜在的错误来源。你需要

  1. 从文本中的数学形式转换Rosenbrock函数和雅可比的方程式到数字代码。

  2. 明确地计算雅可比。对于复杂方程式,此任务易于错误。

此示例显示使用符号数学来描述问题语句和后续步骤最小化或甚至消除此类错误。

将RosenBrock功能重写为非线性方程系统

首先,转换rosenbrock函数F到非线性方程系统F, 在哪里F是一个梯度F

清除n = 64;x = sym('X',[n,1]);f = sum(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 5. - 400 X 5. X 6. - X 5. 2 - 2 200. X 6. - 200. X 5. 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 *(x6 - x5 ^ 2) - 2;200 * x6-200 * x5 ^ 2;2 * x7 - 400 * x7 *(x8 - x7 ^ 2) - 2;200 * x8 - 200 * x7 ^ 2;2 * x9 - 400 * x9 *(x10 - x9 ^ 2) - 2;200 * x10-200 * x9 ^ 2]

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

f(1:2:n)=简化(f(1:2:n)+ 2 * x(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 5. 10. X 6. - 10. X 5. 2 1 - X 7. 10. X 8. - 10. X 7. 2 1 - X 9. 10. X 10. - 10. X 9. 2 [1 - x1;10 * x2 - 10 * x1 ^ 2;1 - x3;10 * x4 - 10 * x3 ^ 2;1 - x5;10 * x6 - 10 * x5 ^ 2;1 - x7;10 * x8 - 10 * x7 ^ 2;1 - x9;10 * x10 - 10 * x9 ^ 2]

计算表示方程式系统的矩阵族织物

雅各比亚计算雅各比亚的F。该函数符号计算雅可碧族人,从而避免了与衍生物的数值近似相关的错误。

jf = jacobian(f,x);

显示Jacobian矩阵的前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 5. 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),sym(0),sym(0),sym(0),sym(0),sym(0),sym(0),sym(0),sym(0),sym(0);-20 * x1,sym(10),sym(0),sym(0),sym(0),sym(0),sym(0),sym(0),sym(0),sym(0);sym(0),sym(0),-sym(1),sym(0),sym(0),sym(0),sym(0),sym(0),sym(0),sym(0);符号(0),sym(0),-20 * x3,sym(10),sym(0),sym(0),sym(0),sym(0),sym(0),sym(0);sym(0),sym(0),sym(0),sym(0),-sym(1),sym(0),sym(0),sym(0),sym(0),sym(0);符号(0),sym(0),sym(0),sym(0),-20 * x5,sym(10),sym(0),sym(0),sym(0),sym(0);sym(0),sym(0),sym(0),sym(0),sym(0),sym(0),-sym(1),sym(0),sym(0),sym(0);符号(0),sym(0),sym(0),sym(0),sym(0),sym(0),-20 * x7,sym(10),sym(0),sym(0);sym(0),sym(0),sym(0),sym(0),sym(0),sym(0),sym(0),sym(0),-sym(1),sym(0);sym(0),sym(0),sym(0),sym(0),sym(0),sym(0),sym(0),sym(0),-20 * x9,sym(10)]

大多数雅各比亚矩阵的元素JF.是零。尽管如此,当您将此矩阵转换为aMatlab功能,结果是密集的数字矩阵。通常,对稀疏矩阵的操作比在密集矩阵上的操作更有效。

因此,要创建有效的代码,仅转换非零元素JF.在调用matllabfunction之前致象征载体。JS.代表稀疏模式JF.

[是,js] =查找(jf);jf = jf(jf〜= 0);

将方程式和雅各比的转换为Matlab函数

方程式F代表RosenBrock函数的是一个由符号表达式组成的符号矩阵。能够用它解决它FSOLVE.功能,将此系统转换为aMatlab功能。在此步骤中,转换两个方便F和它的雅各比亚,JF.,到一个基于文件的MATLAB函数,FJFFUN.。原则上,这允许FJF.重用变量。或者,您可以将它们转换为单个MATLAB函数。

matlabfunction([f; jf],'var',X,'文件''fjffun');

FJFFUN.接受变量作为列表,但FSOLVE.期待变量矢量。功能genericobj.将向量转换为列表。匿名功能Bananaobj.定义为修复参数值genericobj.。注意在功能中使用稀疏性模式genericobj.。另外注意这种使用方法FJFFUN.genericobj.一起与所代表的特定表达无关F并且可以用作任何F

Bananaobj = @(y)genericobj(y,@ fjffun,是,js)
Bananaobj =function_handle具有值:@(y)genericobj(y,@ fjffun,是,js)

使用FSOLVE来数字地解决非线性方程系统

FSOLVE.对于方程式,转换为MATLAB功能。使用起点x(i)= -1.9对于奇数指数,和x(i)= 2对于偶数指数。放'展示''iter'看到求解器的进步。放'雅各比亚''上'使用jacobian定义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 11 11 2 3093.71 11 329 11 2 3 225.12 2.5 34.8 2.5 3 4 212.48 6.25 325 3 4 212.48 6.25 34.1 6.25 4 5 212.48 6.25 34.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.功能,是符号数学工具箱中可用的数字解算器。关键差异vpasolve.FSOLVE.就是它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。(char(x(x)));结尾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('0'),VPA('0'),VPA('1.0'),VPA('1.0'),VPA('1.0'),VPA('1.0'),VPA('1.0'),VPA('1.0'),VPA('0'),VPA('1.0'),VPA('0'),VPA('1.0'),VPA('1.0'),VPA('0'),VPA('1.0'),VPA('0'),VPA('1.0'),VPA('1.0')]
                  
                 

辅助功能

功能[f,j] = genericobj(x,fjffun,是,js)%genericobj用作输入,矢量x,函数和雅各拜评估%函数处理fjffun,稀疏模式是,js和返回作为输出,%函数和jacobian的数值:f和jfunction%fjs(1:长度(x))是该函数的数字矢量%fjs(长度(x)+1:结束)是雅可比的非零条目的数字矢量xcell = num2cell(x);fjs = fjffun(xcell {:});f = fjs(1:长度(x));j =稀疏(是,js,fjs(长度(x)+1:结束));结尾

版权©.2016年Mathworks,Inc。