1

나는이 합성 심슨의 규칙에 대한 코드를 가지고있다. 그러나, 나는 꽤 오랫동안 그것과 함께 놀고 있었고, 나는 그것이 작동하도록 할 수 없다.복합 심슨의 규칙

어떻게 알고리즘을 수정할 수 있습니까?

function out = Sc2(func,a,b,N) 
% Sc(func,a,b,N) 
% This function calculates the integral of func on the interval [a,b] 
% using the Composite Simpson's rule with N subintervals. 
x=linspace(a,b,N+1); 
% Partition [a,b] into N subintervals 
fx=func(x); 
h=(b-a)/(2*N); 
%define for odd and even sums 
sum_even = 0; 
for i = 1:N-1 
    x(i) = a + (2*i-2)*h; 
    sum_even = sum_even + func(x(i)); 
end 

sum_odd = 0; 

for i = 1:N+1 
    x(i) = a + (2*i-1)*h; 
    sum_odd = sum_odd + func(x(i)); 
end 
% Define the length of a subinterval 
out=(h/3)*(fx(1)+ 2*sum_even + 4*sum_odd +fx(end)); 
% Apply the composite Simpsons rule 
end 
+0

이 숙제입니까? – Jubobs

+1

"제대로 작동하지 않는 것 같습니다."그리고 "어떻게이 알고리즘을 고칠 수 있습니까?" 이 사이트 또는 특정 사이트에서 특정 또는 도움이되지 않습니까? 이 함수를 어떻게 테스트하고 있는지, 즉 어떤 함수를 통합하고 어떻게'Sc2' 함수를 호출하는지 보여주십시오. 오류 메시지가 나타나면 전체를보고하십시오. 결과가 정확한지 어떻게 결정합니까? 질문을 수정하십시오. 숙제 인 경우이를 표시해야합니다. – horchler

답변

4

글쎄요, 귀하의 h 정의가 잘못되었습니다. h은 추정하려는 각 간격의 단계 크기를 나타냅니다. 불필요하게 2로 나누고 있습니다. h 정의에서 2를 제거하십시오. n이 아닌 값이 x 인 경우 함수를 평가 중입니다. 이 문장을 사용하지 않을 것이므로 결국이 문장을 제거해야합니다.

또한 홀수 또는 짝수 값의 경우 1에서 N+1까지 또는 1에서 N-1까지 합계입니다. 잘못된 값입니다. 홀수 간격 또는 간격으로 다른 모든 값을 선택하므로 실제로는 1에서 N/2 - 1으로 반복되어야합니다. i을 곱하면되는 것을 알아내는 것을 피하기 위해 이것을 건너 뛰고 루프를 2 단계로 진행하십시오.

홀수 및 짝수 간격의 값을 루프 오버하거나 추가하지 않는 것이 좋습니다. 홀수 또는 짝수 값인 x을 지정하고 합계를 적용하면 쉽게 할 수 있습니다. 콜론 연산자를 사용하여 2의 단계 크기를 지정하여 홀수 또는 심지어 전체 합계에 적용 할 값인 x의 값을 정확히 결정합니다.

또한 xn 포인트 간격으로 선언하지만 루프의 값을 덮어 쓰는 중입니다. 이 경우 코드에 실제로 x 선언이 필요하지 않습니다. 이와 같이

, 여기에 내가 마음에 최적화하여 기능의 수정 된 버전이있어 :

function out = Sc2(func, a, b, N) 

h = (b – a)/N; %// Width of each interval 
odd = 1 : 2 : n-1; %// Define odd interval 
xodd = a + h*odd; %// Create odd x values 
even = 2 : 2 : n-2; %// Create even interval 
xeven = a + h*even; % Create even x values 

%// Return area 
out = (h/3)*(func(a) + 4*sum(func(xodd)) + 2*sum(func(xeven))+ func(b)); 

을하지만, 당신은 당신의 코드가 작동하게하려면, 당신은 단순히 for을 변경해야 반복 반복 제한뿐만 아니라 사용자의 값은 h입니다. 또한 코드의 일부 줄을 제거하고 일부 변수 이름을 변경해야합니다. 따라서 :

function out = Sc2(func,a,b,N) 
% Sc(func,a,b,N) 
% This function calculates the integral of func on the interval [a,b] 
% using the Composite Simpson's rule with N subintervals. 

%// Define width of each segment 
h = (b - a)/N; %// Change 

%//define for odd and even sums 
sum_even = 0; 
for i = 2 : 2 : N-2 %// Change 
    x = a + i*h; %// Change 
    sum_even = sum_even + func(x); 
end 

sum_odd = 0; 

for i = 1 : 2 : N-1 %// Change 
    x = a + i*h %// Change 
    sum_odd = sum_odd + func(x); 
end 

%// Output area 
out = (h/3)*(func(a) + 2*sum_even + 4*sum_odd + func(b)); %// Change 

end