此示例演示了符号数学工具箱有助于最小化求解非线性系统的方程式时的错误。
此示例使用以下符号数学工具箱功能:
计算分析梯度使用坡度
计算分析雅可比使用雅各比亚
将符号结果转换为数字函数matlabfunction.
分析可视化Fplot.
目标是找到最低限度rosenbrock功能,或所谓的“香蕉”功能。
用Fplot.
要快速可视化两个变量的RosenBrock函数
Syms.Xya = 1;B = 100;f(x,y)=(a-x)^ 2 + b *(y-x ^ 2)^ 2
f(x,y)=
FSURF(F,[ - 2 2 -1 3])视图([ - 45 50])Colormap喷射Caxis([0,1000])彩色键
这“具有分析雅可比的非线性方程”优化工具箱中的示例通过使用使用的问题FSOLVE.
功能。该示例中显示的工作流有两个潜在的错误来源。你需要
从文本中的数学形式转换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 =.
匹配优化工具箱中显示的中间结果例子,使用相同的形式
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 =.
用雅各比亚
计算雅各比亚的F
。该函数符号计算雅可碧族人,从而避免了与衍生物的数值近似相关的错误。
jf = jacobian(f,x);
显示Jacobian矩阵的前10行和列。
JF(1:10,1:10)
ans =.
大多数雅各比亚矩阵的元素JF.
是零。尽管如此,当您将此矩阵转换为aMatlab功能,结果是密集的数字矩阵。通常,对稀疏矩阵的操作比在密集矩阵上的操作更有效。
因此,要创建有效的代码,仅转换非零元素JF.
在调用matllabfunction之前致象征载体。是
和JS.
代表稀疏模式JF.
。
[是,js] =查找(jf);jf = jf(jf〜= 0);
方程式F
代表RosenBrock函数的是一个由符号表达式组成的符号矩阵。能够用它解决它FSOLVE.
功能,将此系统转换为aMatlab功能。在此步骤中,转换两个方便F
和它的雅各比亚,JF.
,到一个基于文件的MATLAB函数,FJFFUN.
。原则上,这允许F
和JF.
重用变量。或者,您可以将它们转换为单个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.
对于方程式,转换为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完成,因为通过函数容差的值测量,功能值的向量接近零,并且如梯度测量的问题会常规。
非线性方程系统,F
,可以替代地解决vpasolve.
功能,是符号数学工具箱中可用的数字解算器。关键差异vpasolve.
和FSOLVE.
就是它FSOLVE.
使用双精度算术来解决方程,而vpasolve.
使用可变精度算术,因此,允许您控制计算的准确性。
sol2 = vpasolve(f);
如果将方程系统的解决方案分配给一个变量,sol2.
, 然后vpasolve.
以结构阵列的形式返回解决金宝搏官方网站方案。您可以访问每个解决方案(结构阵列的每个字段):
sol2.x1.
ans =.
你也可以转换sol2.
到符号矢量,然后访问一系列解决方案。金宝搏官方网站例如,显示第5到第25个解决方案:金宝搏官方网站
为了K =(1:64)Sol2_Array(k)= sol2。(char(x(x)));结尾sol2_array(5:25)
ans =.
功能[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。