我正在尝试使用MatCont包解决一个非常大的非线性问题。由于大量的维度和非线性特性,我相信为我的系统提供雅可比行列式的MatCont算法将极大地提高速度。但是,我不能认识到它有一个雅可比行列式使用!
作为一个最小的工作示例,我已经从帮助文档修改了圆形查找器以包含雅可比行列式:
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
因为我告诉它输出'使用JACOBIAN'每次调用雅可比函数时,很明显MatCont没有使用它。
如何使用Jacobian?
答案 0 :(得分:1)
我解决了自己的问题!似乎我非常接近它的工作。以下是有点拙劣,所以如果有人知道如何使用选项,请发布答案。
首先我编辑选项设置,以便在执行延续时它只找到第一个点:
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。