아래 포스팅에서 Wolfram-Alpha 라는 사이트를 통해 인수분해나 그래프 그리는 방법등에 대해 알아봤는데요~



오늘은 추가적으로 미분, 적분을 편하게 도와주는 사이트 들을 조금 소개 드리려 합니다.

  • 적분 사이트로는 아래 주소의 사이트를 발견 했는데


간단하게 다음과 같이 수식을 입력하고



Go 버튼을 누르면 이렇게 결과 수식이 나오더군요.


위 사이트는 정말 수학 공부하기도 좋을것 같은게 수식 밑에 있는 Show steps 버튼을 누르면 다음과 같이 수식 전개 과정도 나옵니다.



마지막에는 그래프도 나오고 아래 포스팅에서 소개 드렸던 maxima 라는 툴과의 비교 그래프도 그려 주므로 더욱 믿을 수 있는 것 같네요.


  • 미분 사이트로는 아래 주소의 사이트가 있습니다.


위 적분 사이트와 비슷한거 보면 같은데서 만든것 같네요.

역시 마찮가지로 수식을 입력한 후에 Go 버튼만 누르면 결과 수식이 나오고~


Show steps 버튼을 누르면 수식 전개 과정도 나옵니다..... 정말 좋네요.



위에 두 사이트는 export 버튼을 누르면 아래 그림과 같이 LaTeX, Maxima, Online calculators 수식으로도 export 할 수 있게 해 줍니다.


요즘 수포자 많다고 하는데 ..... 사실 요즘은 컴퓨터와 인터넷만 있으면 수학 공부하기 정말 좋은 시대라는 생각이 듭니다.

참고링크 : http://webspace.ship.edu/msrenault/tutorial/Tutorial%207%20-%20Incorporating%20JavaScript.html

 

적분을 사용하여 특정 함수에 따른 면적을 표현 할 때 막대 그래프를 사용하느데요

 

오늘은 지오지브라를 사용하여 막대그래프를 표현하는 방법에 대해 설명하려 합니다.

 

지오지브라에서는 막대그래프[] 라는 명령어를 사용하기도 하고 BarChart[] 라는 명령어를 사용하기도 합니다.

 

매뉴얼의 한글화가 완벽하지 않아서 매뉴얼을 참조할때는 영어로 참조하는게 더 편리하더군요. 아래 매뉴얼 참조바랍니다.

 

http://wiki.geogebra.org/en/BarChart_Command

 

위 매뉴얼에 나와 있듯이 BarChart 는 다양한 형태로 사용할 수 있습니다.

 

  1. List 데이터와 list 빈도를 사용할 수 있습니다. 제일 마지막에 막대그래프의 폭을 설정 할 수가 있는데 이는 옵션 입니다.

Ex ) BarChart[{10, 11, 12, 13, 14}, {5, 8, 12, 0, 1},1]

  1. Raw 데이터와 막대그래프의 폭을 설정 할 수 있습니다. 아래 예에서는 막대그래프의 폭을 1로 설정했습니다.

Ex ) BarChart[ {1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 5, 5, 5, 5}, 1]

  1. 막대그래프의 시작 끝 지점과 각 높이의 list 를 사용하여 막대 그래프를 그릴 수 있습니다.

 

막대그래프의 결과는 막대그래프의 면적이 나오게 됩니다.

 

제일 위에 적은 참고링크의 예를 사용하여 막대그래프를 그려보고 함수의 면적을 한번 구해 보도록 합니다.

 

단계는 다음과 같습니다.

 

f(x) = sin(2 x) - (1/10) x² + 3


a = 1


b = 7


n 값은 편의를 위해 슬라이더로 만듭니다.


 

dx = (b - a)/n


rightpoints = Sequence[ f(a + i dx), i, 1, n ] OR rightpoints = 수열[f(a + i dx), i, 1, n]


rightsum = BarChart[ a, b, rightpoints ] OR rightsum = 막대그래프[a, b, rightpoints]


 

위 과정을 거쳐 나온 그래프는 다음과 같습니다.

 

위에서 만든 슬라이더를 에니메이션을 해보면~ 막대그래프의 폭이 좁아지면서 적분의 원리를 이해 할 수 있을 겁니다.



 


오늘의 포스팅에서는 function handle 사용법의 추가 적인 내용들에 대하여 정리하겠습니다.

 

여러 함수에 대해 똑 같은 값을 적용할 때에는 function handle 을 struct classcell class 의 형태로 만들어서 이용할 수가 있습니다.



다음 수식에 대하여 struct 의 형태로 function handle 을 구성하고 그에 따른 값을 알아보죠.

 



 

다음과 같이 struct 의 형태로 표현 할 수 있고, x=-1:0.5:1 에 대한 각 수식의 값을 한번에 구할 수가 있습니다.

 

struct 에 한번에 똑 같은 값 또는 함수 등을 적용 할 때는 structfun() 함수를 이용 합니다.

 

 

위 코드를 실행하면 다음과 같은 결과를 얻을 수 있습니다.

 

ans =

f: [1 0.2500 0 0.2500 1]

g: [-1 -0.1250 1 3.1250 7]

h: [-0.8415 -0.4794 0 0.4794 0.8415]

  


 

위 수식에 대하여 cell 의 형태로 표현하고 위 x 의 범위에 대한 값을 구해 보죠.

 

cell 에 한번에 똑 같은 값 또는 함수 등을 적용 할 때는 cellfun() 함수를 이용 합니다.

 

 

위 코드에 따른 결과는 다음과 같습니다.

 

D{1} =

1.0000 0.2500 0 0.2500 1.0000

D{2} =

-1.0000 -0.1250 1.0000 3.1250 7.0000

D{3} =

-0.8415 -0.4794 0 0.4794 0.8415

  


 

마지막으로 function handle 을 두 번 이용해서 다음 수식을 표현해 보겠습니다.

 

 

적분은 quad() 함수를 이용하겠습니다.

 

quad() 함수의 사용 방법에 대해서는 아래 포스팅을 참조 하시기 바랍니다.

   

 

@ 을 두 번 써서 위 식을 표현 할 수 있습니다.

 

f = @(a,b) (quad(@(x) (x.^2 + b*x + 4), 0, a))

 

임의의 a, b 값에 대해 다음과 같은 결과가 나오는 것을 확인 할 수 있습니다.

 

>> f(1,2)

ans =

5.3333

 

>> f(4,0)

ans =

37.3333

 


다음 페이지에서 



2011/03/14 - [programming language/MATLAB] - MATLAB 적분 int(), quad()



MATLAB 에서 이용 가능한 적분에 대해 학습을 한 적이 있다. 오늘은 추가적으로 수치 적분 함수 중 사다리꼴 기법으로 적분을 수행하는 trapz() 함수에 대해 설명한다.

 

trapz() 함수의 원형은 다음과 같다.

Z = trapz(X,Y)

  • X 값은 함수의 입력이고 Y 값은 함수의 출력이다.

 

trapz() 함수를 이용하여 다음 수식에 대한 적분을 수행해 보자.

 

일단 X 의 범위를 정한다. 적분 구간이 0~3 이므로

X=0:3

X =

0 1 2 3

 

Y= X.^2 + 2.*X + 1

Y =

1 4 9 16

 

integral_value=trapz(X,Y)

integral_value =

21.5000

 

실제 위 식에 대해 적분을 해 보면 21 이 되야 하는데 21.5 가 되는 것을 확인 할 수 있다. 이는 X 값의 간격 1 이 너무 크기 때문이다. 따라서 X 값의 간격을 0.1로 좁게 설정을 하고 다시 계산을 수행해보자.

 

X=0:0.1:3;

Y= X.^2 + 2.*X + 1;

integral_value=trapz(X,Y)

integral_value =

21.005

 

위 결과도 21은 아니다. 그렇다면 간격을 0.01로 더 좁게 하고 계산을 다시 해보자.

X=0:0.01:3;

Y= X.^2 + 2.*X + 1;

integral_value=trapz(X,Y)

integral_value =

21.00005

 

X 값의 간격이 1 à 0.1 à 0.01 로 좁아 질수록 값이 21이라는 값에 근접해 감을 확인 할 수 있다.


MATLAB 을 이용하여 적분을 수행해 보자. MATLAB 을 이용하여 적분을 하는 방법은 크게 두 가지 정도로 구분 할 수 있을 것 같다. 

첫 번째로는 수치적인 적분 방법이고 두 번째는 Symbolic math toolbox 를 이용한 수학적인 접근 방법이다.

수치적인 접근 방법이라 하면 사다리꼴 방법 과 같이 함수를 매우 작은 조각으로 나눠서 부분부분의 면적의 합을 구하는 방법이 될 것이다. 물론 이런 적분을 구하는 알고리즘을 짜서 적분을 할 수도 있겠지만 고맙게도 matlab 은 이런 함수를 제공 해 준다.

quad() 함수를 이용하면 수치 적분이 가능하다. 본 함수는 수치 적분이므로 부정적분을 해 주지는 못한다. 따라서 다음 수식과 같이 구간이 정해진 식에 대해서만 적분 할 수 있다.

 

 

위 수식에 대한 적분은 다음과 같다.

 

F = @(x) x.^2+2.*x+1

F =

@(x)x.^2+2.*x+1

 

quad(F,0,3)

ans =

21

간단하게 해가 나오는 것을 확인 할 수 있다.

하지만 이런 수치적분은 위에서 밝힌 대로 부정적분이 불가능 하다. 부정적분을 할 때는 symbolic math toolbox 를 이용해야 한다. Symbolic math toolbox 는 Mathematica 나 Maple 과 같이 기호로서 계산을 해주는 툴로서 복잡한 수학 계산시 굉장히 편리하게 이용할 수 있다.

 

다음과 같은 수식에 대해 간단하게 부정적분 그리고 임의의 구간에 대한 적분을 수행 해보자.

 

 

부정적분은 굉장히 간단하다.

symbol 로 사용한 변수인 x 를 symbolic 으로 설정해준다.

 

syms x

int(x^2+2*x+1)

그리고 int() 함수 내에 적분할 수식을 써 준다. int() 함수는 integral 의 약자이다. 위 코드의 실행 결과는 다음과 같은 부정적분 결과가 나온다.

 

ans =

(x*(x^2 + 3*x + 3))/3

 

그럼 임의의 구간 a~b 구간에 대해서도 적분을 해 보자. a, b 도 symbolic 으로 설정을 해 준 후에 int() 함수에서 적분 구간을 a, b 라고 명시 해 준다.

 

syms x a b

int(x^2+2*x+1,a,b)

ans =

b*(b*(b/3 + 1) + 1) - a*(a*(a/3 + 1) + 1)

 

다음과 같이 간단하게 a, b 라는 적분구간에 대해 적분이 실행 되는 것을 확인 할 수 있다.


  1. 조민형 2013.08.09 16:46

    적분 질문 있습니다 ㅠㅠ
    바쁘실텐데 답변 주실 수 있으시려나요..

    매트랩 초보라 왜 이런지 모르겠습니다.

    식이 좀 복잡한데,,

    >> int((64*(cos((B*q*cos(phi))/2)^2 - 1)*(cos((A*q*sin(phi))/2)^2 - 1)*(sin(C*q)/(2*C*q) - 1/2))/(A^2*B^2*C^2*q^6*cos(phi)^2*(cos(phi)^2 - 1)),phi,0,pi/2)
    Warning: Explicit integral could not be found.

    ans =

    int(((cos((A*q*sin(phi))/2)^2 - 1)*(64*cos((B*q*cos(phi))/2)^2 - 64)*(sin(C*q)/(2*C*q) - 1/2))/(A^2*B^2*C^2*q^6*cos(phi)^2*(cos(phi)^2 - 1)), phi = 0..pi/2)
    와 같이 적분을 찾을 수 없다고 나옵니다.

    이런 경우 부정적분 값을 도출할 수 있는 스킬이나 노하우 같은게 있나요??

    답변 미리 감사드립니다 !!

    • 남성 2013.08.09 19:02 신고

      저도 몇가지 방법으로 시도는 해봤는데 마찮가지로 Warning: Explicit integral could not be found. 라는 메시지가 뜨네요. 도움 못되 죄송합니다. ^^;

  2. 서형관 2016.12.02 09:22

    임의의 구간 적분에 대해서 질문이 있습니다.
    매트랩을 인터넷에 올라온 글을 보면서 독학하는중 입니다.
    구간a b c는 a=1000 b=8000 c=9000으로 정의하였고 그 나눈 부분을 적분하는 프로그램을 짜고 있는데

    syms n1 0 a
    n1=int((i*n)/(2*(pi)*a^2),n,0,a);
    syms n2 a b
    n2=int(i/(2*(pi)*n),a,b);
    syms n3 b c
    n3=int((i*(c^2-n^2))/((2*(pi)*n)*(c^2-b^2)),b,c);


    이렇게 만들어 봤는데 쉽지 않네요 ㅠㅠ
    어떤부분이 문제인지 알 수 있으신가요??

    • 남성 2016.12.02 21:03 신고

      다음과 같이 해 보세요.

      a=1000;
      b=8000;
      c=9000;

      syms n
      n1=int((1i*n)/(2*(pi)*a^2),n,0,a)
      double(n1)

      n2=int(1i/(2*(pi)*n),a,b)
      double(n2)

      n3=int((1i*(c^2-n^2))/((2*(pi)*n)*(c^2-b^2)),b,c)
      double(n3)


  3. 크레스포 2017.04.15 18:22

    Syms로 적분한 함수의 그래프를 출력하는 방법은 없나요?

+ Recent posts