我编写了一个程序来使用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)
答案 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