首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在MatCont中使用雅可比矩阵

在MatCont中使用雅可比矩阵
EN

Stack Overflow用户
提问于 2015-10-07 23:11:25
回答 1查看 187关注 0票数 0

我正在尝试使用MatCont包来解决一个非常大的非线性问题。由于大量的维度和非线性性质,我相信将我的系统的雅可比提供给MatCont算法将极大地提高速度。然而,我不能让它认识到它有一个雅可比可以使用!

作为一个最小的工作示例,我修改了帮助文档中的圆查找器,使其包含一个Jacobian:

代码语言:javascript
复制
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

然后,我尝试从命令行运行这个程序

代码语言:javascript
复制
[x,v,s,h,f] = cont(@curve,[1;0]);

但是,响应是

代码语言:javascript
复制
first point found
tangent vector to first point found

elapsed time  = 0.2 secs
npoints curve = 300

因为我告诉它在每次调用雅可比函数时输出'USE JACOBIAN‘,所以很明显MatCont没有使用它。

如何使用雅可比矩阵?

EN

回答 1

Stack Overflow用户

发布于 2015-10-08 18:39:07

我解决了我自己的问题!看起来我已经很接近让它工作了。下面是一个有点笨拙,所以如果有人知道如何做与选项,请张贴答案也。

首先,我编辑了选项设置,这样当它执行延续操作时,它只定位第一个点:

代码语言:javascript
复制
function option=options()
    option = contset;
    option = contset(option,'MaxNumPoints',1);
end

它可以使用数值雅可比来做到这一点,第一点在大多数问题中都很清楚。然后使用以下代码从脚本或函数中调用:

代码语言:javascript
复制
[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。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32995974

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档