410 likes | 910 Views
기호 계산 (Symbolic calculation). 소속 : 인하대학교 수학과 전공 : 응용수학 ( 수치해석 ) 강사 : 정 신 자. 기호 계산 (Symbolic calculation). 수치 데이터가 아닌 어떤 수식으로 된 연산 결과를 구하고 싶을 때 사용 예를 들어 , 다항식의 거듭제곱이나 수식끼리의 곱을 계산 하고 싶은 경우 단순한 수식 전개 를 일일이 손으로 할 필요 없이 함수를 사용하여 계산 최근 MATLAB 버전에 강화되는 기능 중 하나가 바로 기호 계산
E N D
기호 계산(Symbolic calculation) 소속 : 인하대학교 수학과 전공 : 응용수학(수치해석) 강사 : 정 신 자
기호 계산(Symbolic calculation) • 수치 데이터가 아닌 어떤 수식으로 된 연산 결과를 구하고 싶을 때 사용 • 예를 들어, 다항식의 거듭제곱이나 수식끼리의 곱을 계산하고 싶은 경우 • 단순한 수식 전개를 일일이 손으로 할 필요 없이 함수를 사용하여 계산 • 최근 MATLAB 버전에 강화되는 기능 중 하나가 바로 기호 계산 • 기호 계산을 사용하기 위해서는 Symbolic math toolbox를 설치해야 함 • Symbolic math toolbox : 기호 계산의 실행에 사용되는 MATLAB 함수 • MATLAB 명령창에서 ‘ver’를 입력한 후 확인할 수 있음
기호 객체 생성 • 기호 객체 • 하나의 변수, 숫자, 기호 변수와 숫자로 구성된 식 • 수식을 나타내는 하나의 문자열을 저장하는 데이터 구조 • 기호 식 • 하나 이상의 기호 객체를 포함하고 있는 수학식 • 기호식이 화면에 입력될 때, 마치 보통의 수치적인 식과 비슷하게 보일지 몰라도 이 식이 기호 객체를 포함하고 있기 때문에 MATLAB에 의해 기호적으로 실행됨 • MATLAB에서 기호 계산을 하기 위해서는 먼저기호 객체를 지정해야 함
기호 객체 생성 • 기호 객체를 생성하기 위해서 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
기호 객체 생성 • 다음과 같이 syms명령을 사용하면 여러 개의 기호변수를 단 한 개의 명령으로 생성할 수 있음 syms variable_name variable_name variable_name • syms 명령에 의해 생성된 변수는 자동으로 화면에 출력되지 않음 • 변수 이름을 입력하면 변수가 생성되었음을 알 수 있음 >> syms y z d >> y y = y
기호식의 생성 • 기호식은 기호 변수로 구성된 수학식 • 기호식도 기호 객체이며 일단 기호 변수가 생성되면 기호식을 생성하기 위해 사용될 수 있음 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
기호식의 생성 >> 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)
기호식의 생성 • 기호식은 수치적인 식을 실행하여 얻어진 수치 변수를 포함할 수 있음 • 이러한 변수들이 기호식에 삽입되면, 기호식은 정확하게 계산함 >> h = 10/3 h = 3.3333 >> k = sym(5); m = sym(7); >> p = k/m + h p = 85/21
기호식의 생성 • 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
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
기호식의 형태 변경 • 기존 기호식의 형태를 바꾸는데 사용될 수 있는 명령어 • 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)
기호식의 형태 변경 • 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)
기호식의 형태 변경 • 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)
기호식의 형태 변경 • 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
기호식의 형태 변경 • 5. simple명령어 • 원식이 가장 작은 수의 문자를 갖는 식의 형태를 찾는다. • MATLAB은 collect, expand, factor, simplify 명령 등의 함수를 적용하여 몇 가지 형태의 식을 생성한 후 가장 짧은 형태의 식을 반환 F = simple(S) simple(S) [F how] = simple(S) S의 가장 짧은 형태가 F에 할당 모든 단순화 결과가 출력됨. 가장 짧은 것이 할당 S의 가장 짧은 형태가 F에 할당됨. 단순화 방법의 이름이 how에 할당
기호식의 형태 변경 >> 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
대수 방정식의 해법 • 1. 단일 방정식의 해법 • 방정식이 하나의 변수를 가지면, 그 해는 수치적인 값을 가짐 • 방정식이 여러 개의 기호 변수를 가진다면, 그 해는 어떤 변수를 다른 변수들의 항으로 나타내어 구할 수 있다 h = solve(eq) h = solve(eq, var) • 인수 eq는 기호식의 이름, MATLAB은 eq = 0으로 하여 풀이한다 • solve(eq, var)은 var 변수에 대하여 풀이한다 • 방정식이 기호 객체로 생성된 변수를 포함하지 않더라도 solve 의 입력값으로 사용할 수 있다 • 하지만, 개개의 변수들은 독립적인 기호 객체로서 존재하지 않는다
대수 방정식의 해법 >> 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
대수 방정식의 해법 • 2. 연립방정식의 해법 • solve 명령에 의해 해를 구할 수 있음 • 방정식의 수와 변수의 수가 같은 경우, 그 해는 수치적인 값이 됨 • 변수의 수가 방정식의 수 보다 많으면, 그 해는 원하는 변수를 다른 변수들의 항으로 나타낸 기호식이 됨 • 연립 방정식은 하나 혹은 여러 개의 해를 가질 수 있음 output = solve(eq1, eq2, …, eqn) output = solve(eq1, eq2, …, eqn, var1, var2, …, varn) • 인수 eq1, eq2, …eqn은 풀어야 할 방정식 • 변수의 수가 방정식의 수 n보다 클 때, 연립방정식에서 구해야 하는 변수는 사용자에 의해 선택될 수 있음(두 번째 형식을 이용함)
대수 방정식의 해법 • [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
대수 방정식의 해법 예 • 원과 선 사이의 교점 • 반경 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)
미분(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
미분 >> 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)
dy dt 상미분 방정식의 해법 • 상미분 방정식(Ordinary differential equation) • 1 개의 독립 변수에 대한 미분 항들로 구성된 미분 방정식 • 상미분 방정식은 dsolve명령을 이용하여 기호적으로 계산될 수 있다 • 1차 ODE은 종속변수의 도함수를 포함하는 방정식이다 • t 를 독립변수로 하고 y를 종속변수로 하면 다음의 형식으로 쓸수 있다 = f(t, y) = f(t, y, ) d2y dt2 dy dt
상미분 방정식의 해법 • 해는 방정식을 만족하는 함수 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)’
상미분 방정식의 해법 >> 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
상미분 방정식의 해법 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은 독립변수 정의를 위해 사용
상미분 방정식의 해법 >> 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))
적분(integration) • 기호적분은 int명령을 사용하여 수행할 수 있음 • 부정적분(미분의 반대)과 정적분(범위내 적분)을 구하는데 사용 • 1. 부정정분을 구하기 위한 형식은 다음과 같음 int(S) 혹은 int(S, var) • S는 기호식의 이름과 S에 직접 입력할 수 있는 식이 될 수 있음 • 여러 개의 기호변수를 가진 식의 적분에 사용되는 int(S, var) 에서는 변수 var에 대하여 적분이 수행됨
적분(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)
∫ (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사용
기호식의 plot • 기호로 되어 있는 수식을 그래프로 그리기 위해서 ezplot명령을 사용(2차원 그래프) ezplot(f) • x축 -2pi < x < 2pi 범위에서 기호로 되어 있는 수식 f의 그래프 • x축의 범위를 조정하고 싶으면 다음과 같이 x축의 한계 값을 입력하여 ezplot을 사용 ezplot(f, [a, b])
기호식의 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)
기호 변수 k 수치 데이터 k 기호 수식 f(k) subs 수치 데이터 k에 대한 수식 f(k)의 값 기호식을 이용한 수치 계산 • 기호 변수로 구성된 기호 수식을 연산하여 구한 기호 객체를 수치 데이터로 변환하는 방법 • MATLAB에서는 연산을 이용하여 수식을 전개한 후 특정 수치를 가지는 변수 값에 대한 그 수식의 값을 구하고 싶을 때 subs명령어를 사용함
기호식을 이용한 수치 계산 • 1. 하나의 기호 변수에 수치값을 대입 • 기호식이 하나 이상의 기호변수를 가질 때, 하나의 기호변수에 수치값을대입 R = subs(S, var, number) • var은 수치값이 대입될 변수 • number는 하나의 숫자(스칼라)일 수 있고, 많은 요소를 가진 배열 (백터, 행렬)일 수도 있음 • S가 하나의 변수를 가지면, 결과값 R은 수치적인 것이 되고 S가 여러 개의 변수를 가지면 그 들 중 하나에만 수치값이 할당된다면 결과값 R은 기호식이 됨
기호식을 이용한 수치 계산 >> 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
기호식을 이용한 수치 계산 • 2. 2개 이상의 기호변수에 수치 값을 대입 • 수식이 여러 개의 기호변수를 가질 때, 2 이상의 변수에 수치값을 대입할 수 있음 R = subs(S, {var1, var2}, {number1, number2}) • var1=number1, var2=number2 값이 대입됨 • 또 다른 기호변수에 수치값을 대입하는 방법은 먼저 변수에 대입하고 나서 subs 명령을 사용
기호식을 이용한 수치 계산 >> 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