Octave “错误”;num2str:精度必须是标量整数>;=0“;
我正在尝试执行一个函数,它按照预期工作,直到第83行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
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,在这种情况下,程序或函数都可以用于此目的。请阅读。您发布了太多的代码来说明问题。另外,请澄清为什么它不工作:错误消息?(复制粘贴完整错误消息)输出错误?(包括实际产出和预期产出)。