我试图评估系列Σ∞ 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
答案 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;中的四行。部分做好了。希望有所帮助。