Matlab嵌套激进

时间:2018-01-30 13:10:47

标签: matlab

在MATLAB中完成一项任务,我似乎无法通过算术解决这个问题,我现在已经尝试了大约6个小时

我需要创建一个接受用户输入的循环> 1(完成)并循环通过以下(m是输入)

t1 = sqrt(m);
t2 = sqrt(m-sqrt(m));
t3 = sqrt(m-sqrt(m+sqrt(m)))
t4 = sqrt(m-sqrt(m+sqrt(m-sqrt(m))))
t5 = sqrt(m-sqrt(m+sqrt(m-sqrt(m+sqrt(m)))))

等等,直到新的t值减去旧的t值为< 1E-12

我目前的代码如下

%Nested Radicals
clear all;
clc;

%User input for m
m = input('Please enter a value for m: ');

%Error message if m is less than 1
if m <= 1
    fprintf('ERROR: m must be greater than 1\n')
    m = input('Please enter a value for m: ');
end

%Error message if m is not an integer
if mod(m,1) ~= 0
    fprintf('m must be an integer\n')
    m = input('Please enter a value for m: \n');
end
%Nested things
t_old = m;
t_new = sqrt(m);
varsign = -1;
index = 1;
loop = true;
endResult = 1e-12;
sqrts = [sqrt(m), sqrt(m-sqrt(m)), sqrt(m-sqrt(m+sqrt(m))), sqrt(m-sqrt(m+sqrt(m-sqrt(m)))), sqrt(m-sqrt(m+sqrt(m-sqrt(m+sqrt(m)))))];
fprintf('m = %d\n',m)
fprintf('t1 = %14.13f\n', t_new')
while loop
    if index ~= 1
        curResult = abs(sqrts(1,index) - sqrts(1, index-1));
    else
        curResult = abs(sqrts(1, index));
    end
    if curResult > endResult
        if index < 5
            t_new = sqrts(1, index+1);
        else
            t_new = sqrts(1, index);
            loop=false;
        end
        if index 
            fprintf('t%d = %14.13f\n', index, t_new)
        end

    else
        fprintf('t%d = %14.13f\n', index, t_new);
        break;
    end
    index = index + 1;

        if index > 50
            fprintf('t%d = %14.13f\n', index, t_new);
            break;
        end

end

2 个答案:

答案 0 :(得分:2)

我不确定你要对sqrts变量做什么,你应该在你的循环中动态计算每一步,因为你不可能知道你需要去多深

m = 5;        % Get m however you want to
n = 0;        % Iteration counter
tol = 1e-12   % Tolerance at which to stop
dt = 1;       % initialise to some value greater than 'tol' so we can start the loop

% Loop until tn is less than tolerance. Would be sensible to add a condition on n,
% like "while tn > tol && n < 1000", so the loop doesn't go on for years if the
% condition takes a trillion loops to be satisfied
while dt > tol   
     % Set the value of the deepest nested expression
    tn = sqrt(m);
    % We know how many times take sqrt, so for loop our way out of the nested function
    % Initially we want the sign to be -1, then +1, -1, ...
    % This is achieved using ((-1)^ii)
    for ii = 1:n
        tn = sqrt(m + ((-1)^ii)*tn);  % Calculate next nested function out
    end
    % Increment iteration number
    n = n + 1; 
    dt = abs( t_old - tn );
    t_old = tn;
end

我没有对你的函数做过任何分析,所以不知道它是否能保证收敛到某个值<1e-12。如果不是那么你肯定需要添加一些最大迭代条件,正如我在上面的评论中所建议的那样。

答案 1 :(得分:2)

除非我非常错误,否则您可以按如下方式编写t(n)的表达式:

t(n) = sqrt(m-sqrt(m+t(n-2));

这使循环更容易:

%Nested Radicals
clear all;
clc;

%User input for m
m = input('Please enter a value for m: ');

%Error message if m is less than 1
if m <= 1
    fprintf('ERROR: m must be greater than 1\n')
    m = input('Please enter a value for m:');
end

%Error message if m is not an integer
if mod(m,1) ~= 0
    fprintf('m must be an integer\n')
    m = input('Please enter a value for m:');
end
%Nested things
t_old = sqrt(m);
t_new = sqrt(m-sqrt(m));
threshold = 1e-12;
k = 3;
while abs(t_new - t_old) >= threshold
  temp = sqrt(m-sqrt(m+t_old));
  t_old = t_new;
  t_new = temp;
  k = k+1;
end

fprintf('t%d = %14.13f\n', k-2, t_old);
fprintf('t%d = %14.13f\n', k-1, t_new);
fprintf('t%d - t%d = %14.13f\n', k-2, k-1, t_old - t_new);

例如:m=9

Please enter a value for m: 9
t17 = 2.3722813232696
t18 = 2.3722813232691
t17 - t18 = 0.0000000000005