主要内容

在优化中提高准确性和性能

这个例子演示了符号数学工具箱在解决非线性方程组时帮助最小化错误。

这个例子使用了以下的符号数学工具箱功能:

目标是找到最小值函数。,或所谓的“香蕉”功能。

f x 1 n / 2 1 0 0 x 2 - x 2 - 1 2 2 + 1 - x 2 - 1 2

使用fplot来创建一个罗森布罗克双变量函数的快速可视化

信谊xy= 1;b = 100;f (x, y) = (ax) ^ 2 + b * (x ^ 2) ^ 2
f (x, y) =
                
                 
                  
                   
                    
                     
                      
                       
                        
                         
                          
                           
                            x
                           
                            -
                           
                            1
                          
                         
                        
                       
                      
                     
                     
                      
                       2
                     
                    
                    
                     +
                    
                     
                      
                       One hundred.
                      
                      
                      
                       
                        
                         
                          
                           
                            
                             
                              y
                             
                              -
                             
                              
                               
                                x
                              
                              
                               
                                2
                              
                             
                            
                           
                          
                         
                        
                       
                       
                        
                         2
                       
                      
                     
                    
                   
                  
                  
                   (x - 1)^2 + 100*(y - x)^2
                 
                
Fsurf (f,[-2 2 -1 3])视图([-45 50])colormap飞机caxis colorbar ([0, 1000])

动机

具有解析雅可比矩阵的非线性方程的例子解决了相同的问题,使用fsolve函数。该示例中显示的工作流有两个潜在的错误来源。你需要

  1. 将罗森布罗克函数和雅可比矩阵的方程从文本的数学形式转换为数字代码。

  2. 明确地计算雅可比矩阵。对于复杂的方程,这个任务很容易出错。

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

将Rosenbrock函数重写为非线性方程组

首先,转换Rosenbrock函数f一个非线性方程组F,在那里F是一个梯度f

Clear 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 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 - 200 * x7 ^ 2 *的混合体;2*x9 - 400*x9*(x10 - x9^2) - 2;200 * * x9 x10 - 200 ^ 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;(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;* x6 - 10 * 10 x5 ^ 2;1 - x7;10 *×8 - 10 * x7 ^ 2;1 - x9;10 * x10 - 10 * x9 ^ 2]

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

使用雅可比矩阵来计算雅可比矩阵F.这个函数象征性地计算雅可比矩阵,从而避免了与导数的数值逼近相关的错误。

摩根富林明=雅可比矩阵(F (x);

给出雅可比矩阵的前10行和前10列。

摩根富林明(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 (信谊(1),信谊(0),信谊(0),信谊(0),信谊(0),信谊(0),信谊(0),信谊(0),信谊(0),信谊(0);-20 * x1,信谊(10),信谊(0),信谊(0),信谊(0),信谊(0),信谊(0),信谊(0),信谊(0),信谊(0);信谊(0),信谊(0),信谊(1),信谊(0),信谊(0),信谊(0),信谊(0),信谊(0),信谊(0),信谊(0);信谊(0),信谊(0)-20 * x3,信谊(10),信谊(0),信谊(0),信谊(0),信谊(0),信谊(0),信谊(0);信谊(0),信谊(0),信谊(0),信谊(0),信谊(1),信谊(0),信谊(0),信谊(0),信谊(0),信谊(0);信谊(0),信谊(0),信谊(0),信谊(0)-20 * x5,信谊(10),信谊(0),信谊(0),信谊(0),信谊(0);信谊(0),信谊(0),信谊(0),信谊(0),信谊(0),信谊(0),信谊(1),信谊(0),信谊(0),信谊(0);信谊(0),信谊(0),信谊(0),信谊(0),信谊(0),信谊(0)-20 * x7,信谊(10),信谊(0),信谊(0);信谊(0),信谊(0),信谊(0),信谊(0),信谊(0),信谊(0),信谊(0),信谊(0),信谊(1),信谊(0);信谊(0),信谊(0),信谊(0),信谊(0),信谊(0),信谊(0),信谊(0),信谊(0)-20 * x9,信谊(10))

雅可比矩阵的大部分元素摩根富林明是0。然而,当你把这个矩阵转换成aMATLAB函数,结果是一个密集的数值矩阵。通常,在稀疏矩阵上的操作比在密集矩阵上的操作更有效。

因此,要创建高效的代码,只需转换摩根富林明在调用符号向量之前matlabFunctionjs表示的稀疏模式摩根富林明

(是,js) =找到(摩根富林明);摩根富林明=摩根富林明(摩根富林明~ = 0);

将方程组和雅可比矩阵转换为MATLAB函数

方程组F,表示Rosenbrock函数,是由符号表达式组成的符号矩阵。能够解决这个问题fsolve函数,将该系统转换为MATLAB函数.在这一步,转换两者是很方便的F及其雅可比矩阵,摩根富林明,为一个基于文件的MATLAB函数,FJFfun.原则上,这是允许的F摩根富林明重用变量。或者,您可以将它们转换为单独的MATLAB函数。

matlabFunction ([F;摩根富林明),“var”, x,“文件”“FJFfun”);

FJFfun接受列表形式的变量,但是fsolve期望一个变量向量。这个函数genericObj将向量转换为列表。匿名函数bananaObj定义为固定的参数值genericObj.注意在函数中使用了稀疏模式genericObj.进一步注意这种方法的使用FJFfungenericObjTogether与表示的特定表达式没有关联F并可用于任何F

bananobj = @(y) genericObj(y,@ fjffun,is,js)
bananaobj =function_handle与价值:@ (y) genericObj (y, @FJFfun, js)

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

使用fsolve为方程组,转换为MATLAB函数。使用起点x (i) = -1.9对于奇指标,和x (i) = 2对于偶数项。集“显示”“通路”查看求解器的进度。集的雅可比矩阵“上”来使用定义的雅可比矩阵bananaobj

x0 (1: n, 1) = -1.9;x0 (2:2: n, 1) = 2;选择= optimoptions (@fsolve,“显示”“通路”的雅可比矩阵“上”);[sol1, Fsol exitflag、输出江淮]= fsolve (x0, bananaobj选项);
一阶规范信赖域迭代Func-count f (x)最优步半径0 1 3093.71 8563.84 615年1 1 2 1 329 1 2 3 3 4 2.5 34.8 2.5 212.48 6.25 34.1 225.104 6.25 - 4 5 212.48 6.25 34.1 6.25 5 6 6 7 1.5625 34.1 1.56 116.793 0.390625 5.79 212.48 0.391 7 8 109.947 0.390625 0.753 0.391 8 9 10 83.6416 2.44141 7.13 99.4696 0.976563 1.2 0.977 92.44 10 11 11 12 2.44141 9.94 2.44 77.7663 2.44141 9.94 77.7663 43.013 2.44 12 13 13 14 0.610352 1.38 0.61 36.4334 0.610352 1.58 0.61 14 15 15 16 18.0108 1.52588 4.91 1.53 34.1448 1.52588 6.71 1.53 16 17 8.48336 1.52588 3.74 1.53 17 18 18 19 1.52588 3.58 1.53 1.46166 1.52588 3.32 3.74566 1.53 19 20 20 21 0 0.0547695 0.29997 1.24265 1.94 1.53 1.53Equation solved. fsolve completed because the vector of function values is near zero as measured by the value of the function tolerance, and the problem appears regular as measured by the gradient.

用vpasolve对非线性方程组进行数值求解

非线性方程组,F,也可以用vpasolve函数,这是一个可在符号数学工具箱中使用的数值求解器。两者的关键区别vpasolvefsolve是,fsolve用双精度算法来解方程,然而vpasolve使用可变精度算法,因此,让您控制计算的准确性。

sol2 = vpasolve (F);

如果你把方程组的解赋给一个变量,sol2,然后vpasolve以结构数组的形式返回解决金宝搏官方网站方案。你可以访问每个解决方案(结构数组的每个字段):

sol2.x1
ans =
                 
                  
                   
                    
                     1.0
                   
                   
                    vpa(“1.0”)
                  
                 

你也可以转换sol2到一个符号向量,然后访问一个解的范围。金宝搏官方网站例如,显示第5 ~ 25个解决方案:金宝搏官方网站

(1) sol2_array(K) = sol2.(char(x(K)));结束sol2_array (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:length(x))是函数的数字向量% FJs(length(x)+1:end)是雅可比矩阵非零项的数值向量伊势亚= num2cell (x);fj = FJFfun(伊势亚{:});F = fj(1:长度(x));J =稀疏(js, fj(长度(x) + 1:结束));结束

版权©2016 The MathWorks, Inc.