错误“num2str:PRECISION 必须是标量整数 >= 0”
Error" num2str: PRECISION must be a scalar integer >= 0"
我正在尝试执行一个函数,它按预期工作,直到第 83 行
disp(['The current root at the ', num2str(k),'-th iterate is ', num2str(p1, 10.5)]);
这是我的实际代码:
function newton(p)
Delta=10e-2;
Epsilon=10e-2;
Small=10e-3;
Max=99;
Cond=0;
k=0;
y0=fny(p);
disp(' ');
disp(['Date = ', date]);
disp(['The Newton-Raphson Iteration with Delta=', num2str(Delta), ' , Epsilon=', num2str(Epsilon)...
,' and Small=', num2str(Small)]);
disp(['The maximum number of iterations allowed is ', num2str(Max)]);
disp(' ');
disp(' k p(k) p(k+1)-p(k) f(p(k))');
disp('|---|--------------------|--------------------|---------------------|');
while k<=Max & Cond==0,
[y_, Df]=fny(p);
if Df==0,
Cond=1;
Dp=0;
else
Dp=y0/Df;
end
p1=p-Dp;
y1=fny(p1);
RelErr=2*abs(Dp)/(abs(p1)+Small);
ds_i=sprintf('%4d %20.10g %20.10g %20.10g', k, p, abs(p1-p), fny(p));
disp(ds_i);
if RelErr<Delta & abs(y1)<Epsilon,
if Cond~=1,
Cond=2;
end
end
p=p1;
y0=y1;
k=k+1;
pokis(k)=(p);
end
ds_i=sprintf('%4d %20.10g %20.10g %20.10g', k, p, p1-p, fny(p));
disp(ds_i);
disp(' ');
disp(['The current root at the ', num2str(k),'-th iterate is ', num2str(p1, 10.5)]);
disp(['Consecutive iterates differ by ', num2str(Dp,10.5)]);
disp(' ');
if Cond==0,
disp('The maximum number of iteration was exceeded! ');
elseif Cond==1,
disp('Division by zero was encountered!');
elseif Cond==2,
disp('The root was found with the disired tolerances!');
end
它在 Matlab 中运行良好,但我不知道为什么它在 Gnu-Octave 上给我错误。我将其输入为 newton(1),图形输出正常,但 disp 函数未按预期显示
找到解决方案:
将num2str
替换为mat2str
没有包含输入和错误消息的完整示例,很难确定确切的问题是什么。但是,您似乎偶然发现了与 Octave 不兼容的未记录的 Matlab 行为,实际上遵循 num2str
的记录行为。根据Matlab function description precision
must be a positive integer specifying the "maximum number of significant digits in the output string". Octave has this same stated behavior as per Octave's function help for num2str。尽管有此规定的要求,但 Matlab 似乎接受 n
的非整数输入,而 Octave 会产生您报告的错误。一些快速测试似乎表明 Matlab 将 round
函数应用于该值。例如,在 Matlab 2020a 中:
>> num2str(123322,2)
ans =
'1.2e+05'
>> num2str(123322,3)
ans =
'1.23e+05'
>> num2str(123322,2.6)
ans =
'1.23e+05'
>> num2str(123322,2.5)
ans =
'1.23e+05'
>> num2str(123322,2.4999)
ans =
'1.2e+05'
所以我不确定你希望通过在 num2str 中指定 precision = 10.5
获得什么行为,但看起来你在 Matlab 中获得了 precision = 11
的效果,但在 Octave 中出现错误.
关于您上面关于 'fixing' 更改为 mat2str 的问题的评论,虽然这现在可能适用于 Octave,但如果您希望它成为兼容代码,我预计您会在 Matlab 中遇到错误。在 Matlab 中,help documentation for mat2str
再次声明精度将“指定为正整数”。这次Matlab 2020a报错:
>> mat2str(123322,2.4999)
Error using mat2str (line 51)
Precision must be a positive integer scalar.
但是虽然 Octave's function help for mat2str 也说它需要整数输入,但它显然允许非整数。而不是应用 round
,但它似乎应用 floor
,t运行 包含任何小数部分。例如,在 Octave 5.2.0 中:
>> mat2str(123322,2)
ans = 1.2e+05
>> mat2str(123322,2.4999)
ans = 1.2e+05
>> mat2str(123322,2.5)
ans = 1.2e+05
>> mat2str(123322,2.6)
ans = 1.2e+05
>> mat2str(123322,3)
ans = 1.23e+05
简而言之,您找到了一个允许您的代码 运行 的解决方法。但是,您将在 Octave 中获得与在 Matlab 中不同的结果。您指定的精度 = 10.5。 Matlab 的 num2str
将其解释为 11。Octave 的 mat2str
将其解释为 10.
我建议您改为询问您想要的实际精度,10 或 11,在这种情况下,程序或函数均可用于此目的。
我正在尝试执行一个函数,它按预期工作,直到第 83 行
disp(['The current root at the ', num2str(k),'-th iterate is ', num2str(p1, 10.5)]);
这是我的实际代码:
function newton(p)
Delta=10e-2;
Epsilon=10e-2;
Small=10e-3;
Max=99;
Cond=0;
k=0;
y0=fny(p);
disp(' ');
disp(['Date = ', date]);
disp(['The Newton-Raphson Iteration with Delta=', num2str(Delta), ' , Epsilon=', num2str(Epsilon)...
,' and Small=', num2str(Small)]);
disp(['The maximum number of iterations allowed is ', num2str(Max)]);
disp(' ');
disp(' k p(k) p(k+1)-p(k) f(p(k))');
disp('|---|--------------------|--------------------|---------------------|');
while k<=Max & Cond==0,
[y_, Df]=fny(p);
if Df==0,
Cond=1;
Dp=0;
else
Dp=y0/Df;
end
p1=p-Dp;
y1=fny(p1);
RelErr=2*abs(Dp)/(abs(p1)+Small);
ds_i=sprintf('%4d %20.10g %20.10g %20.10g', k, p, abs(p1-p), fny(p));
disp(ds_i);
if RelErr<Delta & abs(y1)<Epsilon,
if Cond~=1,
Cond=2;
end
end
p=p1;
y0=y1;
k=k+1;
pokis(k)=(p);
end
ds_i=sprintf('%4d %20.10g %20.10g %20.10g', k, p, p1-p, fny(p));
disp(ds_i);
disp(' ');
disp(['The current root at the ', num2str(k),'-th iterate is ', num2str(p1, 10.5)]);
disp(['Consecutive iterates differ by ', num2str(Dp,10.5)]);
disp(' ');
if Cond==0,
disp('The maximum number of iteration was exceeded! ');
elseif Cond==1,
disp('Division by zero was encountered!');
elseif Cond==2,
disp('The root was found with the disired tolerances!');
end
它在 Matlab 中运行良好,但我不知道为什么它在 Gnu-Octave 上给我错误。我将其输入为 newton(1),图形输出正常,但 disp 函数未按预期显示
找到解决方案:
将num2str
替换为mat2str
没有包含输入和错误消息的完整示例,很难确定确切的问题是什么。但是,您似乎偶然发现了与 Octave 不兼容的未记录的 Matlab 行为,实际上遵循 num2str
的记录行为。根据Matlab function description precision
must be a positive integer specifying the "maximum number of significant digits in the output string". Octave has this same stated behavior as per Octave's function help for num2str。尽管有此规定的要求,但 Matlab 似乎接受 n
的非整数输入,而 Octave 会产生您报告的错误。一些快速测试似乎表明 Matlab 将 round
函数应用于该值。例如,在 Matlab 2020a 中:
>> num2str(123322,2)
ans =
'1.2e+05'
>> num2str(123322,3)
ans =
'1.23e+05'
>> num2str(123322,2.6)
ans =
'1.23e+05'
>> num2str(123322,2.5)
ans =
'1.23e+05'
>> num2str(123322,2.4999)
ans =
'1.2e+05'
所以我不确定你希望通过在 num2str 中指定 precision = 10.5
获得什么行为,但看起来你在 Matlab 中获得了 precision = 11
的效果,但在 Octave 中出现错误.
关于您上面关于 'fixing' 更改为 mat2str 的问题的评论,虽然这现在可能适用于 Octave,但如果您希望它成为兼容代码,我预计您会在 Matlab 中遇到错误。在 Matlab 中,help documentation for mat2str
再次声明精度将“指定为正整数”。这次Matlab 2020a报错:
>> mat2str(123322,2.4999)
Error using mat2str (line 51)
Precision must be a positive integer scalar.
但是虽然 Octave's function help for mat2str 也说它需要整数输入,但它显然允许非整数。而不是应用 round
,但它似乎应用 floor
,t运行 包含任何小数部分。例如,在 Octave 5.2.0 中:
>> mat2str(123322,2)
ans = 1.2e+05
>> mat2str(123322,2.4999)
ans = 1.2e+05
>> mat2str(123322,2.5)
ans = 1.2e+05
>> mat2str(123322,2.6)
ans = 1.2e+05
>> mat2str(123322,3)
ans = 1.23e+05
简而言之,您找到了一个允许您的代码 运行 的解决方法。但是,您将在 Octave 中获得与在 Matlab 中不同的结果。您指定的精度 = 10.5。 Matlab 的 num2str
将其解释为 11。Octave 的 mat2str
将其解释为 10.
我建议您改为询问您想要的实际精度,10 或 11,在这种情况下,程序或函数均可用于此目的。