在matlab中打印选择性迭代

时间:2014-01-03 14:40:17

标签: matlab math printf

我编写了一个程序来使用matlab查找方程的根。它被设计为运行300次迭代以近似根。但是我需要使程序仅输出迭代90-100和290-300。我已经尝试在循环中创建一个循环并将print语句放入其中但是它似乎只打印相同的值而不是下一次迭代。抱歉,如果这是非常基本但对我来说是新手,并且无法弄清楚要做什么。这是迄今为止运行300次迭代的代码。

% MATLAB M-file to solve a single equation using the Rearrangement method.

% The function is f(x)= x^3 - 7x^2 + 11x + 5 = 0 and the rearranged function 
% is g(x) = sqrt((x^3 + 11x - 5)/7).

clc        
clear       

k = 0;      % Set the iteration number
x = 2;      % Set the starting value

diff = 1;   % Set the difference between successive x values
            % to an arbitrary value to start the iteration


fprintf('    k      xk\n')

while k < 300 

   xlast = x; 
   x = sqrt((x^3 + 11*x -5)/7);  %  defines x(k+1) = g(x(k))

   % Calculate the difference between two successive iterations
   diff = abs(x - xlast);  

   k = k + 1;   % Add 1 to the iteration number
   fprintf('%5i%10.6f\n', k, x) 

end 
fprintf('Final solution = %1.5f to 5 decimal places\n',x)

2 个答案:

答案 0 :(得分:4)

如果我理解你的问题,也许你可以定义你想要打印结果的范围,如下所示:

range_1 = [90:100];
range_2 = [290:300];

while k < 300 
   ...

然后围绕你的print语句包装一个条件:

k = k + 1;   % Add 1 to the iteration number

if ( ismember(k, [range_1, range_2]) ) 
   fprintf('%5i%10.6f\n', k, x)
end

这似乎可以解决问题。

编辑:根据Dan的建议,使用ismember()函数检查范围内的包含。

答案 1 :(得分:0)

一个更花哨的版本,如果你想获得频繁的更新(迭代打印),但不希望输出覆盖太多行:

n = 1e4;
hundreds  = linspace(1e2,1e5,1e3);
thousands = linspace(1e3,1e6,1e3);

for i = 1:n
    if (ismember(i,[1,hundreds]));
        if (ismember(i,[1,thousands])); 
            fprintf(1,['\n n=',num2str(n),' -- '])
        end  
        fprintf(1,[num2str(i),', ']); 
    end  
end

这会给你这样的东西

 n=10000 -- 1, 100, 200, 300, 400, 500, 600, 700, 800, 900, 
 n=10000 -- 1000, 1100, 1200, 1300, 1400, 1500, 1600, 1700, 1800, 1900, 
 n=10000 -- 2000, 2100, 2200, 2300, 2400, 2500, 2600, 2700, 2800, 2900, 
 n=10000 -- 3000, ...
 ...        ...
 ...        ...
 n=10000 -- 9000, 9100, 9200, 9300, 9400, 9500, 9600, 9700, 9800, 9900, 
 n=10000 -- 10000