在 matlab 中打印出 Romberg 方法的每次迭代

问题描述 投票:0回答:2

所以我在 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)
matlab printf numerical-integration
2个回答
0
投票

如果您希望在屏幕上输出,您可以简单地键入不带半栏字符的变量名称

;
,如下所示:

[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);

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;
  q = I(1,iter+1);
  fprintf('%.6f %3d\t %.6f\n', q, iter, ea);
  if ea<=es, break; end

在 while 循环结束之前的那段代码的倒数第二行和倒数第三行中,我需要放置 q 计算和 fprintf 语句,这是我最初的想法,并认为我已经测试过,但显然在某个地方出了问题

© www.soinside.com 2019 - 2024. All rights reserved.