错误“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,在这种情况下,程序或函数均可用于此目的。