1 / 39

기호 계산 (Symbolic calculation)

기호 계산 (Symbolic calculation). 소속 : 인하대학교 수학과 전공 : 응용수학 ( 수치해석 ) 강사 : 정 신 자. 기호 계산 (Symbolic calculation). 수치 데이터가 아닌 어떤 수식으로 된 연산 결과를 구하고 싶을 때 사용 예를 들어 , 다항식의 거듭제곱이나 수식끼리의 곱을 계산 하고 싶은 경우 단순한 수식 전개 를 일일이 손으로 할 필요 없이 함수를 사용하여 계산 최근 MATLAB 버전에 강화되는 기능 중 하나가 바로 기호 계산

dalton
Download Presentation

기호 계산 (Symbolic calculation)

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 기호 계산(Symbolic calculation) 소속 : 인하대학교 수학과 전공 : 응용수학(수치해석) 강사 : 정 신 자

  2. 기호 계산(Symbolic calculation) • 수치 데이터가 아닌 어떤 수식으로 된 연산 결과를 구하고 싶을 때 사용 • 예를 들어, 다항식의 거듭제곱이나 수식끼리의 곱을 계산하고 싶은 경우 • 단순한 수식 전개를 일일이 손으로 할 필요 없이 함수를 사용하여 계산 • 최근 MATLAB 버전에 강화되는 기능 중 하나가 바로 기호 계산 • 기호 계산을 사용하기 위해서는 Symbolic math toolbox를 설치해야 함 • Symbolic math toolbox : 기호 계산의 실행에 사용되는 MATLAB 함수 • MATLAB 명령창에서 ‘ver’를 입력한 후 확인할 수 있음

  3. 기호 객체 생성 • 기호 객체 • 하나의 변수, 숫자, 기호 변수와 숫자로 구성된 식 • 수식을 나타내는 하나의 문자열을 저장하는 데이터 구조 • 기호 식 • 하나 이상의 기호 객체를 포함하고 있는 수학식 • 기호식이 화면에 입력될 때, 마치 보통의 수치적인 식과 비슷하게 보일지 몰라도 이 식이 기호 객체를 포함하고 있기 때문에 MATLAB에 의해 기호적으로 실행됨 • MATLAB에서 기호 계산을 하기 위해서는 먼저기호 객체를 지정해야 함

  4. 기호 객체 생성 • 기호 객체를 생성하기 위해서 sym혹은 syms명령을 이용함 object_name = sym(‘string’) >> a = sym('a') %기호객체 a 생성, a에 할당 a = a % 기호 객체 출력은 들어 쓰기 안됨 >> bb = sym('bb') bb = bb >> x = sym('x'); >> g = sym('gamma') g = gamma >> c = sym(5) %숫자 기호객체 생성 c = 5 >> d = sym(7) d = 7 >> e = 13 %수치변수 생성 e = 13

  5. 기호 객체 생성 • 다음과 같이 syms명령을 사용하면 여러 개의 기호변수를 단 한 개의 명령으로 생성할 수 있음 syms variable_name variable_name variable_name • syms 명령에 의해 생성된 변수는 자동으로 화면에 출력되지 않음 • 변수 이름을 입력하면 변수가 생성되었음을 알 수 있음 >> syms y z d >> y y = y

  6. 기호식의 생성 • 기호식은 기호 변수로 구성된 수학식 • 기호식도 기호 객체이며 일단 기호 변수가 생성되면 기호식을 생성하기 위해 사용될 수 있음 Expression_name = Mathmatical_expression • 실행 가능한(덧셈, 뺄셈, 곱셈, 나눗셈) 수학식으로 구성된 기호식이 입력되면 MATLAB은 그대로 연산을 수행 • 모든 계산은 수치적인 근사 없이 정확하게(exactly) 수행함 >> syms a b c x y >> f = a*x^2 + b*x + c f = a*x^2+b*x+c >> g = 2*a/3 + 4*a/7 - 6.5*x + x/3 + 4*5/3 - 1.5 g = 26/21*a-37/6*x+31/6

  7. 기호식의 생성 >> a = sym(3); b = sym(5); >> e = b/a + sqrt(2) e = 5/3+2^(1/2) >> c = 3; d = 5; >> f = d/c + sqrt(2) f = 3.0809 % 근사값이 숫자로 출력됨 >> g = d/a + sqrt(2) % 기호 객체가 하나 이상 포함하고 있을 경우 정확하게 계산 g = 5/3+2^(1/2)

  8. 기호식의 생성 • 기호식은 수치적인 식을 실행하여 얻어진 수치 변수를 포함할 수 있음 • 이러한 변수들이 기호식에 삽입되면, 기호식은 정확하게 계산함 >> h = 10/3 h = 3.3333 >> k = sym(5); m = sym(7); >> p = k/m + h p = 85/21

  9. 기호식의 생성 • double(S)명령은 정확한 형태로 쓰여진 기호식(S)를 수치적인 형태로 변환하는데 사용 p = 85/21 >> pN = double(p) pN = 4.0476 • 생성된 기호 객체는 기호 객체로 생성된 적이 없는 변수의 항으로 이루어진 기호식이 될 수 있음 >> f = sym('a*x^2 + b*x + c') % a, b, c, x 기호객체는 따로 존재하지 않음 f = a*x^2 + b*x + c % 객체 안의 개개의 변수는 기호 연산이 불가능 • 이미 만들어진 기호식은 새로운 기호식을 생성하기 위해 사용될 수 있음 >> syms x y >> SA = x + y SA = x+y >> F = SA^2 + x^2 F = (x+y)^2+x^2

  10. findsym 명령 • findsym 명령은 기존의 기호식에서 어떤 것이 기호 변수인지 찾아내기 위해 사용됨 findsym(S) findsym(S, n) • findsym(S) 명령은 식 S에 있는 모든 기호변수의 이름을 알파벳 순서로 출력함 • findsym(S, n) 식 S에 있는 n개의 기호변수를 기본적인 순서로 출력 • 기본적인 순서는 x와 보다 가까운 문자 순으로 출력 >> syms x h w y d t >> S = h*x^2 + d*y^2 + t*w^2 S = h*x^2+d*y^2+t*w^2 >> findsym(S) ans = d, h, t, w, x, y >> findsym(S, 5) ans = x,y,w,t,h

  11. 기호식의 형태 변경 • 기존 기호식의 형태를 바꾸는데 사용될 수 있는 명령어 • 1. collect명령어 • 식의 여러 항들 중에서 같은 차수의 변수를 포함하는 항을 전개 • 새로운 식의 항들은 그들의 차수에 대해 내림차순으로 정렬됨 collect(S) collect(S, variable_name) >> syms x y >> S = (x^2 + x - exp(x)) * (x + 3) S = (x^2+x-exp(x))*(x+3) >> F = collect(S) F = %차수에 대한 내림차순 x^3+4*x^2+(-exp(x)+3)*x-3*exp(x) >> T = (2*x^2 + y^2) * (x + y^2 + 3) T = (2*x^2+y^2)*(x+y^2+3) >> H = collect(T, y) H = % y 차수에 대한 내림차순 y^4+(2*x^2+x+3)*y^2+2*x^2*(x+3)

  12. 기호식의 형태 변경 • 2. expand명령어 • 합산하는 항끼리 곱하고, 삼각공식, 지수법칙, 로그법칙을 이용하여 합산이 포함된 항을 각각 전개 expand(S) >> syms a x y >> S = (x + 5) * (x - a) * (x + 4) S = (x+5)*(x-a)*(x+4) >> T = expand(S) T = % x3 + 9x2 – ax2 – 9ax + 20x – 20a로 변환 x^3+9*x^2-a*x^2-9*x*a+20*x-20*a >> expand(sin(x-y)) ans = % 삼각공식을 이용하여 전개 sin(x)*cos(y)-cos(x)*sin(y)

  13. 기호식의 형태 변경 • 3. factor명령어 • 다항식을 보다 낮은 차수의 다항식의 곱으로 바꿔 표현하기 위해 사용 >> syms x >> S = x^3 + 4*x^2 - 11*x - 30 S = x^3+4*x^2-11*x-30 >> factor(S) ans = (x-3)*(x+5)*(x+2)

  14. 기호식의 형태 변경 • 4. simplify명령어 • 원식보다 단순한 형태를 가진 식을 만들어 냄 • 수학함수, 함수 법칙, 삼각 공식을 이용하여 가장 간단한 형태의 식을 생성 >> syms x y >> S = x*(x*(x - 8) + 10) - 5 S = x*(x*(x-8)+10)-5 >> SA = simplify(S) SA = % x3 – 8x2 + 10x -5 로 단순화시킴 x^3-8*x^2+10*x-5 >> simplify((x + y) / (1/x + 1/y)) ans = x*y

  15. 기호식의 형태 변경 • 5. simple명령어 • 원식이 가장 작은 수의 문자를 갖는 식의 형태를 찾는다. • MATLAB은 collect, expand, factor, simplify 명령 등의 함수를 적용하여 몇 가지 형태의 식을 생성한 후 가장 짧은 형태의 식을 반환 F = simple(S) simple(S) [F how] = simple(S) S의 가장 짧은 형태가 F에 할당 모든 단순화 결과가 출력됨. 가장 짧은 것이 할당 S의 가장 짧은 형태가 F에 할당됨. 단순화 방법의 이름이 how에 할당

  16. 기호식의 형태 변경 >> syms x >> S = (x^3 - 4*x^2 + 16*x) / (x^3 + 64) S = (x^3-4*x^2+16*x)/(x^3+64) >> F = simple(S) F = x/(x+4) >> [G how] = simple(S) G = x/(x+4) how = simplify

  17. 대수 방정식의 해법 • 1. 단일 방정식의 해법 • 방정식이 하나의 변수를 가지면, 그 해는 수치적인 값을 가짐 • 방정식이 여러 개의 기호 변수를 가진다면, 그 해는 어떤 변수를 다른 변수들의 항으로 나타내어 구할 수 있다 h = solve(eq) h = solve(eq, var) • 인수 eq는 기호식의 이름, MATLAB은 eq = 0으로 하여 풀이한다 • solve(eq, var)은 var 변수에 대하여 풀이한다 • 방정식이 기호 객체로 생성된 변수를 포함하지 않더라도 solve 의 입력값으로 사용할 수 있다 • 하지만, 개개의 변수들은 독립적인 기호 객체로서 존재하지 않는다

  18. 대수 방정식의 해법 >> syms a b x y z >> h = solve(exp(2*z) - 5) h = 1/2*log(5) >> S = x^2 - x - 6 S = % x2 – x – 6 = (x-3)(x+2) x^2-x-6 >> k = solve(S) k = 3 -2 >> T = a*x^2 + 5*b*x + 20 T = % ax2 + 5bx + 20 a*x^2+5*b*x+20 >> solve(T) ans = 1/2/a*(-5*b+(25*b^2-80*a)^(1/2)) 1/2/a*(-5*b-(25*b^2-80*a)^(1/2)) >> M = solve(T, a) M = %변수 a에 대하여 풀이함 -5*(b*x+4)/x^2

  19. 대수 방정식의 해법 • 2. 연립방정식의 해법 • solve 명령에 의해 해를 구할 수 있음 • 방정식의 수와 변수의 수가 같은 경우, 그 해는 수치적인 값이 됨 • 변수의 수가 방정식의 수 보다 많으면, 그 해는 원하는 변수를 다른 변수들의 항으로 나타낸 기호식이 됨 • 연립 방정식은 하나 혹은 여러 개의 해를 가질 수 있음 output = solve(eq1, eq2, …, eqn) output = solve(eq1, eq2, …, eqn, var1, var2, …, varn) • 인수 eq1, eq2, …eqn은 풀어야 할 방정식 • 변수의 수가 방정식의 수 n보다 클 때, 연립방정식에서 구해야 하는 변수는 사용자에 의해 선택될 수 있음(두 번째 형식을 이용함)

  20. 대수 방정식의 해법 • [varA, varB, varC] = solve(eq1, eq2, eq3) 인 경우 • 해당 해는 변수 varA, varB, varC에 할당됨 >> syms x y t >> S = 10*x + 12*y + 16*t; >> [xt yt] = solve(S, '5*x - y = 13*t') xt = % x, y에 대한 해가 xt, yt에 할당됨 2*t yt = -3*t • x, y에 대해서 풀이할 수도 있지만, 다른 변수에 대해서도 풀이가 가능함 >> [tx yx] = solve(S, '5*x - y = 13*t', y, t) tx = % t에 관한 해를 구함 1/2*x yx = % y에 관한 해를 구함 -3/2*x

  21. 대수 방정식의 해법 예 • 원과 선 사이의 교점 • 반경 R과 중심점 (2, 4)를 갖는 x-y 평면의 원에 대한 방정식 (x-2)2 + (y-4)2 = R2로 주어지며 이 평면에 있는 어떤 직선의 방정식 y = x/2 + 1로 주어진다. 직선과 원이 만나는 점들의 좌표를 구하시오 >> syms x y R >> [xc, yc] = solve('(x-2)^2 + (y-4)^2 = R^2', 'y = x/2 + 1') xc = 14/5+2/5*(-16+5*R^2)^(1/2) 14/5-2/5*(-16+5*R^2)^(1/2) yc = 12/5+1/5*(-16+5*R^2)^(1/2) 12/5-1/5*(-16+5*R^2)^(1/2)

  22. 미분(differentiation) • 기호 미분은 diff명령을 이용하여 구할 수 있음 diff(S)혹은 diff(S, var) • S는 기호식의 이름 • diff(S, var) 명령에서는 변수 var에 대하여 미분이 수행됨 • 2차 혹은 그 이상의 도함수는diff(S, n) 혹은 diff(S, var, n) 명령을 사용하여 구할 수 있음 • 2차 도함수 인 경우에는 n=2, 3차 도함수는 n=3 값이 결정됨 • 미분될 식이 기호 객체로 생성된 변수를 포함하지 않더라도 diff 명령에 문자열로 직접 입력하여 수행할 수 있음0

  23. 미분 >> syms x y t >> S = exp(x^4); >> diff(S) ans = 4*x^3*exp(x^4) >> diff('(1-4*x)^3') ans = -12*(1-4*x)^2 >> R = 5*y^2*cos(3*t); >> diff(R) ans = 10*y*cos(3*t) >> diff(R, t) % t에 대한 미분을 수행 ans = -15*y^2*sin(3*t) >> diff(S, 2) % S의 2차 도함수를 구함 ans = 12*x^2*exp(x^4)+16*x^6*exp(x^4)

  24. dy dt 상미분 방정식의 해법 • 상미분 방정식(Ordinary differential equation) • 1 개의 독립 변수에 대한 미분 항들로 구성된 미분 방정식 • 상미분 방정식은 dsolve명령을 이용하여 기호적으로 계산될 수 있다 • 1차 ODE은 종속변수의 도함수를 포함하는 방정식이다 • t 를 독립변수로 하고 y를 종속변수로 하면 다음의 형식으로 쓸수 있다 = f(t, y) = f(t, y, ) d2y dt2 dy dt

  25. 상미분 방정식의 해법 • 해는 방정식을 만족하는 함수 y = f(t), 해는 일반해 될 수도 있고 특수해가 될 수도 있다 • 일반해: 어떤 상수들을 포함 (C1, C2, C3, …) • 특수해: 상수값은 해가 초기 조건이나 경계조건을 만족하도록 하는 특정한 수치값을 얻어서 계산 1. 일반해를 얻는 방법 dsolve(‘eq’) 혹은 dsolve(‘eq’, ‘var’) • eq는 풀어야 할 방정식, 문자열로 입력해야 한다 • dsolve() 에서 독립변수는 t 로 가정, dsolve(‘eq’, ‘t’) t를 독립변수로 정의 • 방정식을 입력할 때, 문자 D는 미분을 뜻함, y가 종속변수, t가 독립변수, Dy는 dy/dt. 방정식 dy/dt + 3y = 100  ‘Dy + 3*y = 100’ • 2차 도함수 : D2, 3차 도함수: D3등으로 입력 • d2y/dt2 + 3(dy/dt) + 5y = sin(t)  ‘D2y +3*Dy + 5*y = sin(t)’

  26. 상미분 방정식의 해법 >> dsolve('Dy = 4*t + 2*y') % dy/dt = 4t + 2y의 일반해를 구하여라. ans = % y = -2t – 1 + C1e2t -2*t-1+exp(2*t)*C1 >> dsolve('D2x + 2*Dx + x = 0') % d2x/dt2 + 2(dx/dt) + x = 0 ans = C1*exp(-t)+C2*exp(-t)*t >> dsolve('Ds = a*x^2') % ds/dt = ax2을 풀이함 ans = a*x^2*t+C1 >> dsolve('Ds = a*x^2', 'x') % ds/dx = ax2을 풀이함 ans = 1/3*a*x^3+C1 >> dsolve('Ds = a*x^2', 'a') % ds/da = ax2을 풀이함 ans = 1/2*a^2*x^2+C1

  27. 상미분 방정식의 해법 2. 특수해 얻는 방법 • ODE의 특수해는 경계 혹은 초기 조건이 지정된 경우에 얻어질 수 있다 • 1차 방정식 : 1개, 2차방정식 : 2개, 3차방정식 : 3개 등의 조건이 필요 dsolve(‘eq’, ‘cond1’, ‘var’) dsolve(‘eq’, ‘cond1’, ‘cond2’, …, ‘var’) • 고차 방정식을 풀기 위해서는 부가적인 경계조건이 명령에 입력되어야 한다, 만약 조건의 수가 차수보다 작을 경우 적분상수(C1, C2, C3, ..) 를 포함하는 해를 반환 • 경계조건은 다음과 같이 문자열로 입력됨 * y(a) = A  ‘y(a)=A’*y’(a) = A  ‘Dy(a)=A’ * y’’(a) = A  ‘D2y(a) = A’ • var은 독립변수 정의를 위해 사용

  28. 상미분 방정식의 해법 >> dsolve('Dy + 4*y = 60', 'y(0) = 5') ans = 15-10*exp(-4*t) >> dsolve('D2y - 2*Dy + 2*y = 0', 'y(0) = 1', 'Dy(0) = 0') ans = -exp(t)*sin(t)+exp(t)*cos(t) >> factor(ans) ans = -exp(t)*(sin(t)-cos(t))

  29. 적분(integration) • 기호적분은 int명령을 사용하여 수행할 수 있음 • 부정적분(미분의 반대)과 정적분(범위내 적분)을 구하는데 사용 • 1. 부정정분을 구하기 위한 형식은 다음과 같음 int(S) 혹은 int(S, var) • S는 기호식의 이름과 S에 직접 입력할 수 있는 식이 될 수 있음 • 여러 개의 기호변수를 가진 식의 적분에 사용되는 int(S, var) 에서는 변수 var에 대하여 적분이 수행됨

  30. 적분(integration) >> syms x y t >> S = 2*cos(x) - 6*x; >> int(S) ans = 2*sin(x)-3*x^2 >> int(x*sin(x)) ans = sin(x)-x*cos(x) >> R = 5*y^2*cos(4*t); >> int(R) % y(기본 기호변수)에 대하여 적분 ans = 5/3*y^3*cos(4*t) >> int(R, t) % t에 대하여 적분 ans = 5/4*y^2*sin(4*t)

  31. ∫ (sin(y) + 5y2)dy pi 0 적분(integration) • 2. 정적분 위한 형식은 다음과 같다 • a, b는 적분 범위, 범위는 숫자 또는 기호변수일 수 있다 int(S, a, b) 혹은 int(S, var, a, b) • 구하는 예 >> int(‘sin(y) - 5*y^2’, 0, pi) ans = 2-5/3*pi^3 >> syms y >> int(sin(y) - 5*y^2, 0, pi) ans = 2-5/3*pi^3 Syms미사용 syms사용

  32. 기호식의 plot • 기호로 되어 있는 수식을 그래프로 그리기 위해서 ezplot명령을 사용(2차원 그래프) ezplot(f) • x축 -2pi < x < 2pi 범위에서 기호로 되어 있는 수식 f의 그래프 • x축의 범위를 조정하고 싶으면 다음과 같이 x축의 한계 값을 입력하여 ezplot을 사용 ezplot(f, [a, b])

  33. 기호식의 plot >> syms x >> f = 1/(1 + x*cos(x) + exp(x)); >> ezplot(f) >> syms t >> x = cos(2*t); >> y = sin(4*t); >> ezplot(x, y)

  34. 기호 변수 k 수치 데이터 k 기호 수식 f(k) subs 수치 데이터 k에 대한 수식 f(k)의 값 기호식을 이용한 수치 계산 • 기호 변수로 구성된 기호 수식을 연산하여 구한 기호 객체를 수치 데이터로 변환하는 방법 • MATLAB에서는 연산을 이용하여 수식을 전개한 후 특정 수치를 가지는 변수 값에 대한 그 수식의 값을 구하고 싶을 때 subs명령어를 사용함

  35. 기호식을 이용한 수치 계산 • 1. 하나의 기호 변수에 수치값을 대입 • 기호식이 하나 이상의 기호변수를 가질 때, 하나의 기호변수에 수치값을대입 R = subs(S, var, number) • var은 수치값이 대입될 변수 • number는 하나의 숫자(스칼라)일 수 있고, 많은 요소를 가진 배열 (백터, 행렬)일 수도 있음 • S가 하나의 변수를 가지면, 결과값 R은 수치적인 것이 되고 S가 여러 개의 변수를 가지면 그 들 중 하나에만 수치값이 할당된다면 결과값 R은 기호식이 됨

  36. 기호식을 이용한 수치 계산 >> syms x >> S = 0.8*x^3 + 4*exp(0.5*x) S = 4/5*x^3+4*exp(1/2*x) >> SD = diff(S) SD = 12/5*x^2+2*exp(1/2*x) >> subs(SD, x, 2) ans = 15.0366 >> SDU = subs(SD, x, [2:0.5:4]) SDU = 15.0366 21.9807 30.5634 40.9092 53.1781

  37. 기호식을 이용한 수치 계산 • 2. 2개 이상의 기호변수에 수치 값을 대입 • 수식이 여러 개의 기호변수를 가질 때, 2 이상의 변수에 수치값을 대입할 수 있음 R = subs(S, {var1, var2}, {number1, number2}) • var1=number1, var2=number2 값이 대입됨 • 또 다른 기호변수에 수치값을 대입하는 방법은 먼저 변수에 대입하고 나서 subs 명령을 사용

  38. 기호식을 이용한 수치 계산 >> syms a b c e x >> S = a*x^e + b*x + c S = a*x^e+b*x+c >> subs(S, {a, b, c, e, x}, {5, 4, -20, 2, 3}) ans = 37 >> W = subs(S, {a, b, c, e, x}, {[4 2 0], [2 4 6], [2 2 2], [1 3 5], [3 2 1]}) W = 20 26 8 >> syms A c m x y >> S = A*cos(m*x) + c*y; >> A = 10; m=0.5; c=3; % 먼저 변수에 값을 대입 후 subs 수행 >> subs(S) ans = 10*cos(1/2*x)+3*y

  39. 실습3

More Related