所以我在 matlab 中有 romberg 方法的代码,我试图让它为 q 的每次迭代输出结果。
我尝试的是显示为表格,所以这样做
z = [q;iter]
fprintf('%.6f %5d', z)
如果我只包含
,这不会产生任何正确的结果fprintf('%5d', iter)
在 while 循环内,它将显示
1 2
但不是最终循环,并且显然不会告诉我每次迭代时的 Q 值,因为我没有包含它,但至少我觉得随着迭代的到来,我已经取得了一些进展几乎如我所愿
这是我的代码,它正确地生成了最终迭代和最后的值,但不是之前的迭代,显然它不会显示 q 的旧值,因为它位于 while 循环之外,但是当我将其包含在其中时,我感到很奇怪结果并没有像我预期的那样
function [q,ea,iter]=romberg(func,a,b,es,maxit,varargin)
% romberg: Romberg integration quadrature
% q = romberg(func,a,b,es,maxit,p1,p2,...):
% Romberg integration.
% input:
% func = name of function to be integrated
% a, b = integration limits
% es = desired relative error (default = 0.000001%)
% maxit = maximum allowable iterations (default = 30)
% pl,p2,... = additional parameters used by func
% output:
% q = integral estimate
% ea = approximate relative error (%)
% iter = number of iterations
if nargin<3,error('at least 3 input arguments required'),end
if nargin<4||isempty(es), es=0.000001;end
if nargin<5||isempty(maxit), maxit=50;end
n = 1;
I(1,1) = trap(func,a,b,n,varargin{:});
iter = 0;
while iter<maxit
iter = iter+1;
n = 2^iter;
I(iter+1,1) = trap(func,a,b,n,varargin{:});
for k = 2:iter+1
j = 2+iter-k;
I(j,k) = (4^(k-1)*I(j+1,k-1)-I(j,k-1))/(4^(k-1)-1);
end
ea = abs((I(1,iter+1)-I(2,iter))/I(1,iter+1))*100;
if ea<=es, break; end
end
q = I(1,iter+1);
fprintf('%.6f %5d', q, iter)
如果您希望在屏幕上输出,您可以简单地键入不带半栏字符的变量名称
;
,如下所示:
[q, iter] %q and iter must meet dimensional constraint or
% this will print on the screen the content of the two variables
%for formated output use the command format:
format LONG, q
format SHORT, iter
但是如果您想在文件中写入,您有多种方法:
使用命令的简单方法
save
:
save filename.mat q iter
更复杂的是使用
fopen
fprintf
命令:
fid = fopen('filename.txt','w');
fprintf(fid,'%.6f %5d', q, iter);
好吧,我实际上能够非常简单地解决这个问题,一定是之前盯着屏幕太久了,因为它非常简单
while iter<maxit
iter = iter+1;
n = 2^iter;
I(iter+1,1) = trap(func,a,b,n,varargin{:});
for k = 2:iter+1
j = 2+iter-k;
I(j,k) = (4^(k-1)*I(j+1,k-1)-I(j,k-1))/(4^(k-1)-1);
end
ea = abs((I(1,iter+1)-I(2,iter))/I(1,iter+1))*100;
q = I(1,iter+1);
fprintf('%.6f %3d\t %.6f\n', q, iter, ea);
if ea<=es, break; end
在 while 循环结束之前的那段代码的倒数第二行和倒数第三行中,我需要放置 q 计算和 fprintf 语句,这是我最初的想法,并认为我已经测试过,但显然在某个地方出了问题