我正在尝试使用MatCont包来解决一个非常大的非线性问题。由于大量的维度和非线性性质,我相信将我的系统的雅可比提供给MatCont算法将极大地提高速度。然而,我不能让它认识到它有一个雅可比可以使用!
作为一个最小的工作示例,我修改了帮助文档中的圆查找器,使其包含一个Jacobian:
function out = curve()
out{1}=@curvefunc;
out{2}=@defaultprocessor;
out{3}=@options;
out{4}=@jacobian;
out{13}=@adapt;
end
function f=curvefunc(x)
f=x(1)^2+x(2)^2-1;
end
function J=jacobian(x)
disp('USE JACOBIAN')
J=[2*x(1) , 2*x(2)];
end
function varargout=defaultprocessor(varargin)
if nargin>2
varargout{3}=varargin{3};
end
varargout{2}=[0];
varargout{1}=0;
end
function option=options()
option=contset;
end
function [res,x,v]=adapt(x,v)
res=[];
end然后,我尝试从命令行运行这个程序
[x,v,s,h,f] = cont(@curve,[1;0]);但是,响应是
first point found
tangent vector to first point found
elapsed time = 0.2 secs
npoints curve = 300因为我告诉它在每次调用雅可比函数时输出'USE JACOBIAN‘,所以很明显MatCont没有使用它。
如何使用雅可比矩阵?
发布于 2015-10-08 18:39:07
我解决了我自己的问题!看起来我已经很接近让它工作了。下面是一个有点笨拙,所以如果有人知道如何做与选项,请张贴答案也。
首先,我编辑了选项设置,这样当它执行延续操作时,它只定位第一个点:
function option=options()
option = contset;
option = contset(option,'MaxNumPoints',1);
end它可以使用数值雅可比来做到这一点,第一点在大多数问题中都很清楚。然后使用以下代码从脚本或函数中调用:
[x,v,s,h,f] = cont(@curve,[1;0]);
global cds
cds.options.MaxNumPoints=[];
cds.symjac=1;
[x,v,s,h,f] = cont(x,v,s,h,f,cds);第一行使用数值雅可比找到初始点,就像它设置的那样。然后手动调整连续器以首先对最大点数没有限制(这可以设置为任何适当的数字),然后将用户提供的雅可比矩阵的使用设置为1(真)。然后,继续使用新的设置,并正确使用Jacobain。
https://stackoverflow.com/questions/32995974
复制相似问题