使用while循环评估Octave中的重复序列

时间:2016-02-15 12:09:52

标签: matlab octave

我试图评估系列Σ n = 1 u使用 while 循环在Octave中 n 。提供了递归关系 u n + 1 =(u n 2

| u n |时,总和应该停止< 10 -8

到目前为止,这是我得到的:

n=30
ser(1)=0.5;
sumser(1)=ser(1)
for k=1:n
    ser(k+1)=ser(1)^2;
end
for k=1:n
    while sumser(k)<10^-8
        sumser(k+1)=sumser(k)+ser(k+1)
    endwhile
end

我一直收到错误:

  

错误:addex:A(I):索引越界;值2超出界限1

     

错误:从

调用      第8行第3行

addex

2 个答案:

答案 0 :(得分:0)

如果我已正确理解您的问题,那么这应该可以解决问题。您的代码有太多问题无法单独解决(除非我误解了这个问题):

u(1) = 0.5;
S = u;
n = 1;
while (abs(u(n)) >= 10e-8)
    n = n + 1;
    u(n) = u(n-1)^2;
    S(n) = u(n) + S(n-1);
end

答案 1 :(得分:0)

实际上,您不需要遍历n,而只需对代码进行矢量化。您尝试做的是对序列求和,直到元素小于给定的容差(表示为 tol ,在这种情况下为10e-8)。我假设您将从u(1)&gt; 0开始。然后,只要u(1)<1,该过程最终将停止。由于递归关系,一旦u(1)和tol被预先指定,我们已经知道何时停止 - 当u(n)> = tol但是u(n + 1)<= tol.Here是代码:

function s=sum_seq(u1,tol)
%tol is the tolerance. In your case, 10e-8
if(u1<0)||(u1>=1)
    disp('Error! Wrong choice of u(1)!');
    s=[];
else
    K=log10(tol)/log10(u1); %K=log_{u1}(tol) is an auxiliary variable
    n=floor(log2(K))+1; %It makes sure u(n)=u(1)^(2^(n-1))>tol>=u(n+1)
    A=u1.^(2^(0:n-1));
    s=sum(A);
end

然后,您通过运行s=sum_seq(0.5,10e-8)来调用获取结果。如果你不想使用一个函数,那么&#34; else&#34;中的四行。部分做好了。希望有所帮助。