Matlab 雅可比函数返回误差“;未定义函数';雅可比矩阵&x27;对于类型为';双倍'&引用;
我试图用雅可比矩阵来解一个方程,用牛顿-拉斐逊法,但我一直得到一个“双重”误差。还安装了Symbolic。我想知道我在这里使用F是否正确。对于F(1)和F(2),我必须分别使用雅可比矩阵吗?以下是脚本:Matlab 雅可比函数返回误差“;未定义函数';雅可比矩阵&x27;对于类型为';双倍'&引用;,matlab,Matlab,我试图用雅可比矩阵来解一个方程,用牛顿-拉斐逊法,但我一直得到一个“双重”误差。还安装了Symbolic。我想知道我在这里使用F是否正确。对于F(1)和F(2),我必须分别使用雅可比矩阵吗?以下是脚本: X=[0.75 0.25]; %N-dimensional array, first guess then solution Y=[0 0]; F(1)=(X(1)^2)+(X(2)^2)-1; %right hand side functions F(2)=X(1)+X(2)-1; %rig
X=[0.75 0.25]; %N-dimensional array, first guess then solution
Y=[0 0];
F(1)=(X(1)^2)+(X(2)^2)-1; %right hand side functions
F(2)=X(1)+X(2)-1; %right hand side functions
MAXIT=10;
ITEST=1;
counter=0;
ABSER=0.00001;
RELER=.1;
DFDX=jacobian(F,X);
[X,ITEST,counter] =NLNR(X,F,MAXIT,counter,ABSER,RELER,ITEST,DFDX);
fprintf('answer for X1 is %d and X2 is %d and ITEST is %d.\n',X(1),X(2),ITEST);
fprintf('number of interations is %d.\n',counter);
这就是功能:
function [X,ITEST,counter] =NLNR(X,F,MAXIT,counter,ABSER,RELER,ITEST)
while ITEST==1 %run loop as long as ITEST is 1
counter=counter+1; %use counter to keep track of iterations
dX=DFDX/(-F);
X=X+dX;
if abs(Y(1)-X(1))<ABSER %check convergence
ITEST=3;
end
if abs((Y(1)-X(1))/X(1))<RELER %check convergence
ITEST=3;
end
if counter>MAXIT %check divergence
ITEST=2;
end
Y(1)=X(1); %set Y to check diff in next loop
Y(2)=X(2);
end
函数[X,ITEST,counter]=NLNR(X,F,MAXIT,counter,ABSER,RELER,ITEST)
当ITEST==1%时,只要ITEST为1,就运行循环
计数器=计数器+1;%使用计数器跟踪迭代
dX=DFDX/(-F);
X=X+dX;
如果abs(Y(1)-X(1))在您的matlab安装中没有名为jacobian
的函数。如果阅读文档,您会注意到具有该名称的两个函数都是工具箱的一部分:
可能您没有安装或许可这些工具箱
对于您来说,最好的解决方案可能是在matlab文件交换中搜索符合您需求的实现。在您的matlab安装中没有名为jacobian
的函数。如果阅读文档,您会注意到具有该名称的两个函数都是工具箱的一部分:
可能您没有安装或许可这些工具箱
对于您来说,最好的解决方案可能是在matlab文件交换中搜索符合您要求的实现。看起来您可以很容易地将不正确使用的符号雅可比函数转换为使用符号数学:
X = [0.75 0.25];
x = sym('x',[1 2]);
F = [x(1)^2+x(2)^2-1;
x(1)+x(2)-1];
DFDX = jacobian(F,x)
DFDX_sub = subs(DFDX,x,X)
返回
DFDX =
[ 2*x1, 2*x2]
[ 1, 1]
DFDX_sub =
[ 3/2, 1/2]
[ 1, 1]
然后可以使用double
将DFDX\u sub
转换为浮点数组。请注意,jacobian
的第一个参数也可以是返回向量的函数的句柄(与符号函数或表达式相反):
看起来您可以很容易地将不正确使用的符号雅可比函数转换为使用符号数学:
X = [0.75 0.25];
x = sym('x',[1 2]);
F = [x(1)^2+x(2)^2-1;
x(1)+x(2)-1];
DFDX = jacobian(F,x)
DFDX_sub = subs(DFDX,x,X)
返回
DFDX =
[ 2*x1, 2*x2]
[ 1, 1]
DFDX_sub =
[ 3/2, 1/2]
[ 1, 1]
然后可以使用double
将DFDX\u sub
转换为浮点数组。请注意,jacobian
的第一个参数也可以是返回向量的函数的句柄(与符号函数或表达式相反):
我怀疑您设法命名了一个变量jacobian
。检查您是否未执行此操作,运行清除
并重试again@Amir,请不要在这个问题中标记雅可比矩阵。。。看在上帝的份上,我恐怕函数jacobian
需要一个变量,我怀疑你设法命名了一个变量jacobian
。检查您是否未执行此操作,运行清除
并重试again@Amir,请不要在这个问题中标记雅可比矩阵。。。看在上帝的份上,我恐怕雅可比函数需要一个符号。我不认为这是问题所在,我正在使用一台学校电脑,上面说我安装了符号数学工具箱版本6.1(R2014b)@user2606257:好的,当符号工具箱存在时,我没有想到会出现错误消息。您有一个函数jacobian
,但它需要类型为sym
的输入参数,而不是double
。它解析地解决了这个问题,我不知道如何适应你的情况。我不认为这是问题所在,我正在使用一台学校计算机,它说我安装了符号:符号数学工具箱版本6.1(R2014b)@user2606257:好的,我没想到当符号工具箱存在时会出现错误消息。您有一个函数jacobian
,但它需要类型为sym
的输入参数,而不是double
。它解析地解决了这个问题,我不知道如何使它适应你的情况。