在MatCont中使用Jacobian

时间:2015-10-07 15:11:25

标签: matlab

我正在尝试使用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?

1 个答案:

答案 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。