为什么while循环不适用于复合simpson的1/3

时间:2017-09-27 00:24:15

标签: matlab

我有一种情况,我有2个主题来计算while循环中复合simpson的1/3规则,当其中一个主题的误差小于0.001时,我必须停止迭代并打印掉值。我尝试过使用while循环,但我仍然无法得到正确的结果。

error = 1; % Jump start
n = 5; % number of points

disp('Integration for Subject 1')
disp('No.pts  Left Comp Simp 1/3  Right Comp Simp 1/3  Left Quad  Right 
Quad')

while error > 0.001
% For left leg
f1 = @(x) s1L(1)*x.^4 + s1L(2)*x.^3 + s1L(3)*x.^2 + s1L(4)*x + s1L(5);
a = valid_time1L(1);
b = valid_time1L(end);
h = (b - a)/(n-1) ;
x = a:h:b;
fx = f1(x);
sum_even = sum(fx(2:2:end-1));
sum_odd = sum(fx(3:2:end-2));

L_simp1 = (h/3)*(f1(a) + 4*sum_even + 2*sum_odd + f1(b));
xTheoL1 = quad(f1,a,b);
error = abs((L_simp1 - xTheoL1)/xTheoL1);


% For right leg
f2 = @(x) s1R(1).*x.^4 + s1R(2).*x.^3 + s1R(3).*x.^2 + s1R(4).*x + s1R(5);
a = valid_time1R(1);
b = valid_time1R(end);
h = (b - a)/(n-1);
x = a:h:b;
fx = f2(x);
sum_even = sum(fx(2:2:end-1));
sum_odd = sum(fx(3:2:end-2));

R_simp1 = (h/3)*(f2(a) + 4*sum_even + 2*sum_odd + f2(b));
xTheoR1 = quad(f2,a,b);
error = abs((R_simp1 - xTheoR1)/xTheoR1);

fprintf('%d \t\t %.4f \t\t\t %.4f \t\t\t %.4f \t 
%.4f\n',n,L_simp1,R_simp1,xTheoL1,xTheoR1)

n = n + 2;
end

1 个答案:

答案 0 :(得分:0)

您的代码的一个大问题是您没有将左右腿的错误分开。 while循环一旦到达结尾就会被重新评估,所以如果你不分开错误,那么你只会评估其中一个。

errorR = 1; % Jump start
errorL = 1; % Jump start
n = 5; % number of points

disp('Integration for Subject 1')
disp('No.pts  Left Comp Simp 1/3  Right Comp Simp 1/3  Left Quad  Right Quad')

while errorR > 0.001 && errorL > 0.001
% For left leg
f1 = @(x) s1L(1)*x.^4 + s1L(2)*x.^3 + s1L(3)*x.^2 + s1L(4)*x + s1L(5);
a = valid_time1L(1);
b = valid_time1L(end);
h = (b - a)/(n-1) ;
x = a:h:b;
fx = f1(x);
sum_even = sum(fx(2:2:end-1));
sum_odd = sum(fx(3:2:end-2));

L_simp1 = (h/3)*(f1(a) + 4*sum_even + 2*sum_odd + f1(b));
xTheoL1 = quad(f1,a,b);
errorL = abs((L_simp1 - xTheoL1)/xTheoL1);


% For right leg
f2 = @(x) s1R(1).*x.^4 + s1R(2).*x.^3 + s1R(3).*x.^2 + s1R(4).*x + s1R(5);
a = valid_time1R(1);
b = valid_time1R(end);
h = (b - a)/(n-1);
x = a:h:b;
fx = f2(x);
sum_even = sum(fx(2:2:end-1));
sum_odd = sum(fx(3:2:end-2));

R_simp1 = (h/3)*(f2(a) + 4*sum_even + 2*sum_odd + f2(b));
xTheoR1 = quad(f2,a,b);
errorR = abs((R_simp1 - xTheoR1)/xTheoR1);

fprintf('%d \t\t %.4f \t\t\t %.4f \t\t\t %.4f \t%.4f\n',n,L_simp1,R_simp1,xTheoL1,xTheoR1)

n = n + 2;
end