>

다음은 일반적인 지역에 대한 이중 적분을 추정하기 위해 만든 프로그램입니다. 꽤 정확하지만 매우 느립니다. (정확한 결과를 얻으려면 약 30 초가 걸립니다)

코드는 다음과 같습니다. 행은 가독성을 위해 들여 쓰기됩니다.

ClrHome
Input "Surface: ",Str0
Str0→Y₈
Input "y-Bound 1: ",Str0
Str0→Y₉
Input "y-Bound 2: ",Str0
Str0→Y₀
Input "X1: ",A
Input "X2: ",B
Input "Num of intv: ",N
(B-A)/N→D
0→V
For(K,0,N-1
    A+KD+.5D→X
    V+fnInt(abs(Y₀-Y₉),X,A+KD,A+(K+1)D)fnInt(Y₈,Y,Y₀(X),Y₉(X))/(Y₀(X)-Y₉(X→V
End
DelVar DDelVar XDelVar YDelVar Str0
Disp "
Disp "Volume in R: ",V

변수 설명 :

Str0: Arbitrary (input)
Y₈: Equation of surface f(x,y)
Y₉: Equation of one bound of region R
Y₀: Equation of other bound of region R
A: x-value of left bound of region R (input)
B: x-value of right bound of region R (input)
N: Number of Δx intervals (input)
D: Size of Δx interval
X: x-value of midpoint of Δx interval
V: Volume under the surface f(x,y) bound by the region R (output)

기본적으로, 내가 다루는 방법은x-y평면에서R영역을 취하고 있다는 것입니다 ( Δx는 너비) 및 면적 ( fnInt(abs(Y₀-Y₉),X,A+KD,A+(K+1)D) ) 찾기 ). 그런 다음 해당 슬라이스의 중간에있는x-값을 찾은 다음 해당x를 따라 평균z-값을 찾습니다 ( fnInt(Y₈,Y,Y₀(X),Y₉(X))/(Y₀(X)-Y₉(X)) ), 전체 볼륨 조각의 높이에 대한 합리적인 추정이라고 가정합니다. 그런 다음 For( 를 실행  여러 번 반복하고 전체 조각을 찾기 위해 모든 조각을 합산하십시오.

그러나 문제는 정확하고 충분한 답변을 얻으려면 많은 간격 (약 50-100)이 필요하다는 것입니다. 이는 어리석은 시간이 걸립니다.

나는 이미 모든 expr( 를 돌아 다니면서 조금 최적화하려고했습니다. 예전에는 사용했지만 여전히 매우 느립니다.

최적화에 대한 제안?

  • 답변 # 1

    중요한 부분은 다음과 같습니다.

    0→V
    For(K,0,N-1
        A+KD+.5D→X
        V+fnInt(abs(Y₀-Y₉),X,A+KD,A+(K+1)D)fnInt(Y₈,Y,Y₀(X),Y₉(X))/(Y₀(X)-Y₉(X→V
    End
    
    

    네번째 줄을 다음과 같이 바꾸는 것이 좋습니다 :

    V+DfnInt(Y₈,Y,Y₀,Y₉)→V
    
    

    이유가 있습니다 : 너비 D 의 단일 슬라이스에서 볼륨이 될만큼 얇은 슬라이스가 있어야합니다.   DfnInt(Y₈,Y,Y₀,Y₉) 에 의해 근사 될 수 있습니다 ;그 지역을 정확하게 얻는 것보다 더 중요합니다. 이번 변경으로 전체 속도가 약 3 배 증가합니다.

    이 작업을 마치면 For (루프를 완전히 삭제하고 sum(seq( 를 사용할 수 있습니다  대신에. 이것은 약간의 성능 향상에만 도움이됩니다. 병목 현상은 여전히 ​​ fnInt( 입니다 . 그러나 더 나은 스타일입니다.

    또 다른 트릭 : 정확한 fnInt( 보다 x 축을 따라 중간 점 규칙 계산에 의해 정밀도가 더 제한되기 때문에  Y 축을 따라 fnInt( 의 공차를 증가시킬 수 있습니다  예를 들어, .005. 그러면 전체 루프가됩니다 :

    Dsum(seq(fnInt(Y₈,Y,Y₀,Y₉,.005),X,A+.5D,B,D→V
    
    

    ( seq( 에 선택적 'step'인수를 사용합니다. .

    또 다른 가능성은 fnInt( 대신둘 다축에 중간 점 규칙을 사용하는 것입니다 . 이것이 속도를 높이거나 정확도를 줄이는 데 얼마나 도움이 될지는 모르겠지만 한 축에서 중간 점 규칙을 사용하는 것보다 정확도가 너무 나쁘지 않을 것으로 생각됩니다.

  • 이전 java - 웹 스크래핑 앱의 브릿지 디자인 패턴 구현 - 후속 조치
  • 다음 c++ - 비트 조작 도구 세트