Octave “错误”;num2str:精度必须是标量整数>;=0“;

Octave “错误”;num2str:精度必须是标量整数>;=0“;,octave,Octave,我正在尝试执行一个函数,它按照预期工作,直到第83行 disp(['当前根在',num2str(k),'第次迭代是',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 Itera

我正在尝试执行一个函数,它按照预期工作,直到第83行

disp(['当前根在',num2str(k),'第次迭代是',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

函数牛顿(p)
δ=10e-2;
ε=10e-2;
小=10e-3;
Max=99;
Cond=0;
k=0;
y0=fny(p);
disp(“”);
disp(['Date=',Date]);
disp(['Newton-Raphson迭代与Delta=',num2str(Delta),',,Epsilon=',num2str(Epsilon)。。。
,'和Small=',num2str(Small)];
disp(['允许的最大迭代次数为',num2str(Max)]);
disp(“”);
disp('kp(k)p(k+1)-p(k)f(p(k)));
disp(“|--|--|-----------------------------------|--------------------|”);
当k找到解决方案时:


num2str
替换为
mat2str

如果没有输入和错误消息的完整示例,很难确定确切的问题是什么。然而,您似乎无意中发现了未记录的Matlab行为,该行为与实际遵循
num2str
记录的行为的Octave不兼容。根据
规则,精度必须为正整数,指定“输出字符串中的最大有效位数”。八度音阶具有与所述相同的行为。尽管有此要求,Matlab似乎接受
n
的非整数输入,而倍频程产生报告的错误。一些快速测试似乎表明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
的效果,但在倍频程中出现了一个错误

关于您在上面关于通过更改为mat2str来“修复”问题的评论,虽然这在倍频程中很可能对您有效,但如果您希望这是兼容的代码,我希望您在Matlab中会遇到错误。在Matlab中,再次声明精度“指定为正整数”。这一次,Matlab 2020a抛出一个错误:

>> mat2str(123322,2.4999)
Error using mat2str (line 51)
Precision must be a positive integer scalar.
虽然它也表示需要整数输入,但它显然允许非整数输入。而不是应用
四舍五入
,但是它似乎应用
下限
,截断任何小数部分。例如,在倍频程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
简而言之,您已经找到了一种允许代码运行的变通方法。然而,在八度音程中得到的结果将不同于在Matlab中得到的结果。您指定的精度为10.5。Matlab的
num2str
将其解释为11。八度音阶的
mat2str
将其解释为10

我建议您询问您想要的实际精度,10或11,在这种情况下,程序或函数都可以用于此目的。

请阅读。您发布了太多的代码来说明问题。另外,请澄清为什么它不工作:错误消息?(复制粘贴完整错误消息)输出错误?(包括实际产出和预期产出)。