2016-11-04 2 views
-1

저는 사다리꼴 규칙을 사용하여 C로 곡선 아래의 영역을 해결하는 프로그램을 작성하려고했습니다. 문제는 제 논리가 괜찮아요, 알고리즘을 여러 번 검토 한 결과 오류를 찾을 수 없다고 생각합니다.Riemann Sum, C의 사다리꼴 규칙

이것은 내 교수가 지정한 것이고 우리가 배열을 사용하기를 원하지 않습니다. 그래서 당신은 아무 것도 볼 수 없습니다.

func, a, p, q, err을 스캔합니다. 여기서 func은 사용할 함수 (함수 # 1 또는 # 2이지만 # 1 만 수행했습니다), a는 상수, p 초기 x이고, q는 최종 x이며, err은 에러 마진입니다.

프로그램은 간격을 분할하고 지역의 마지막 계산까지 영역을 계산 - 우리가 계산 총 면적 미만 10^-ERR

편집과 같다 : 나는 LutzL

에 몇 가지 변경 감사를했습니다
#include<stdio.h> 
#include<math.h> 

double F1(double x,double a){ 
    double f1=0.0; 
    f1=(sqrt(a-pow(x,2))); 
    return f1; 
} 

int main(){ 
    double a=0.0,p=0.0,q=0.0,h=0.0,x=0.0,err=0; 
    int func=3,n=2; 
    double power=0.0,T=0.0; 
    double sum=0.0,last=0.0,difference=1.0; 

    scanf("%d",&func); 

    while(func!=0){ 
     n=2; 
     scanf("%lf%lf%lf%lf",&a,&p,&q,&err); 
     power=pow(10.0,-err); 
     h=(q-p)/n; 

     if(func==1){ 
      difference=1.0; 
      while(difference>=power){ 
       h=(q-p)/n; 
       sum=0.0; 
       for(x=p+h;x<=q-h;x++){ 
        sum+=(2*F1(x,a)); 
       } 
       T=(h/2)*(F1(p,a)+F1(q,a)+sum); 
       if(difference==1.0){ 
        difference=T; 
       }else{ 
        difference=last-T; 
       } 
       last=T; 
       n++; 
       } 
     } 
    printf("%.5lf\n",T); 
    scanf("%d",&func); 
    } 
return 0; 
} 

1, 4, -2, 1, 9를 입력하면 오류가 발생합니다. 5.05481을 출력해야하지만 대신 4.59808을 출력합니다.

+2

어떻게해야합니까? 오류/문제점은 무엇입니까? –

+1

무엇이 문제입니까? 오류가 무엇입니까? 구현은 여러 위치에서 호출 할 수있는 함수 대신 기본 메서드에 모든 코드가 있으므로 유용하지 않습니다. – duffymo

+0

각 시도 사이에'sum'을'0'으로 재설정해야합니다. –

답변

1

sump+h에서 p+(n-1)*h=q-h까지의 인수에 대한 함수 값, 즉 n-1 함수 값을 추가해야합니다. 현재 n 함수 값을 추가하십시오.

루프 내부에 n을 두 번 사용하지 마십시오.

최선의 구현은 중간 합계

n=2^k, h=(q-p)/2^k

M(k)= f(p+h/2)+f(p+3h/2)+...+f(p+(2n-1)*h/2) 

를 사용합니다.

그러자 사다리꼴

T(k)=0.5*f(p)+f(p+h)+...+f(p+(n-1)*h)+0.5*f(q) 

T(0)=(f(p)+f(q))/2와 재귀에게

T(k+1) = T(k) + M(k) 

만족 합산. 적분 근사치는 물론 T(k)*(q-p)/2^k입니다.

+0

정말 고마워요! 나는 그 변화를 만들었고, 지금 나는 바른 결과물을 얻기 위해 더 가깝다. – Marelisse