Main Content

기호 표현식에서 MATLAB 함수 생성하기

matlabFunction을 사용하여 기호 표현식에서 변수에 숫자를 대입하는 것처럼 숫자형 값을 계산하는 MATLAB® 함수 핸들을 생성할 수 있습니다. 또한 matlabFunction은 숫자형 인수를 받고 그 인수에 적용된 기호 표현식을 평가하는 파일을 만들 수 있습니다. 생성된 파일은 이 파일을 실행하는 컴퓨터에 Symbolic Math Toolbox™ 함수에 대한 라이선스가 있는지 여부에 관계없이 모든 MATLAB 계산에 사용할 수 있습니다.

함수 핸들 생성하기

matlabFunction은 모든 기호 표현식에서 함수 핸들을 생성할 수 있습니다. 예를 들어, 다음과 같이 입력합니다.

syms x y
r = sqrt(x^2 + y^2);
ht = matlabFunction(tanh(r))
ht = 
  function_handle with value:
    @(x,y)tanh(sqrt(x.^2+y.^2))

이 함수 핸들을 사용하여 수치적으로 계산할 수 있습니다.

ht(.5,.5)
ans =
    0.6089

일반 MATLAB 배정밀도 숫자나 행렬을 함수 핸들에 전달할 수 있습니다. 예를 들어, 다음과 같이 입력합니다.

cc = [.5,3]; 
dd = [-.5,.5];
ht(cc, dd)
ans =
    0.6089    0.9954

일부 기호 표현식은 MATLAB 함수를 사용하여 표현할 수 없습니다. matlabFunction은 이러한 기호 표현식을 변환할 수 없지만 경고를 발생시킵니다. 이러한 표현식은 정의되지 않은 함수 호출을 초래할 수 있으므로 항상 변환 결과를 확인하고 결과로 만들어진 함수를 실행하여 결과를 확인하십시오.

변수의 순서 제어하기

matlabFunction은 기호 표현식에서 사전순으로 입력 변수를 생성합니다. 이것이 바로 함수 핸들 생성하기에서 함수 핸들에 xy 앞에 있는 이유입니다.

ht = @(x,y)tanh((x.^2 + y.^2).^(1./2))

vars 옵션을 사용하여 함수 핸들에서 입력 변수의 순서를 지정할 수 있습니다. 문자형 벡터 또는 기호 배열로 구성된 셀형 배열 또는 기호 변수로 구성된 벡터를 전달하여 순서를 지정합니다. 예를 들어, 다음과 같이 입력합니다.

syms x y z
r = sqrt(x^2 + 3*y^2 + 5*z^2);
ht1 = matlabFunction(tanh(r), 'vars', [y x z])
ht1 = 
  function_handle with value:
    @(y,x,z)tanh(sqrt(x.^2+y.^2.*3.0+z.^2.*5.0))
ht2 = matlabFunction(tanh(r), 'vars', {'x', 'y', 'z'})
ht2 = 
  function_handle with value:
    @(x,y,z)tanh(sqrt(x.^2+y.^2.*3.0+z.^2.*5.0))
ht3 = matlabFunction(tanh(r), 'vars', {'x', [y z]})
ht3 = 
  function_handle with value:
    @(x,in2)tanh(sqrt(x.^2+in2(:,1).^2.*3.0+in2(:,2).^2.*5.0))

파일 생성하기

함수 핸들 외에도 기호 표현식에서 파일을 생성할 수 있습니다. file 옵션을 사용하여 파일 이름을 지정합니다. 파일 이름이나 파일의 경로를 포함하는 문자형 벡터를 전달합니다. 파일의 경로를 지정하지 않으면 matlabFunction은 현재 폴더에 이 파일을 생성합니다.

이 예제는 배정밀도 입력값 t, x, 및 y에 대한 기호 행렬 F의 값을 계산하는 파일을 생성합니다.

syms x y t
z = (x^3 - tan(y))/(x^3 + tan(y));
w = z/(1 + t^2);
F = [w,(1 + t^2)*x/y; (1 + t^2)*x/y,3*z - 1];
matlabFunction(F,'file','testMatrix.m')

파일 testMatrix.m은 다음 코드를 포함합니다.

function F = testMatrix(t,x,y)
%TESTMATRIX
%    F = TESTMATRIX(T,X,Y)

t2 = x.^2;
t3 = tan(y);
t4 = t2.*x;
t5 = t.^2;
t6 = t5 + 1;
t7 = 1./y;
t8 = t6.*t7.*x;
t9 = t3 + t4;
t10 = 1./t9;
F = [-(t10.*(t3 - t4))./t6,t8; t8,- t10.*(3.*t3 - 3.*t2.*x) - 1];

matlabFunction은 중간 변수를 많이 생성합니다. 이를 최적화된 코드라고 합니다. MATLAB은 소문자 t에 자동 생성된 숫자가 붙은 형태(예: t32)로 중간 변수를 생성합니다. 중간 변수는 중간 표현식(예: F 계산에서 t4, t6, t8, t9t10)을 재사용하여 결과 코드를 보다 효율적으로 만들 수 있습니다. 중간 변수를 사용하는 것은 표현식을 짧게 유지하여 코드를 더 읽기 쉽게 해 줍니다.

입력 변수를 디폴트 순서인 사전순으로 정렬하지 않으려면 vars 옵션을 사용하여 순서를 제어하십시오. 예제를 계속 보겠습니다.

matlabFunction(F,'file','testMatrix.m','vars',[x y t])

입력값 순서가 다르면서 이전 파일과 동등한 파일을 생성합니다.

function F = testMatrix(x,y,t)
...

출력 변수의 이름 지정하기

기본적으로 출력 변수의 이름은 matlabFunction을 호출할 때 사용하는 이름과 일치합니다. 예를 들어, 변수 FmatlabFunction을 호출해 봅니다.

syms x y t
z = (x^3 - tan(y))/(x^3 + tan(y));
w = z/(1 + t^2);
F = [w, (1 + t^2)*x/y; (1 + t^2)*x/y,3*z - 1];
matlabFunction(F,'file','testMatrix.m','vars',[x y t])

출력 변수의 생성된 이름도 F입니다.

function F = testMatrix(x,y,t)
...

개별 변수 대신 표현식을 사용하여 matlabFunction을 호출해 봅니다.

syms x y t
z = (x^3 - tan(y))/(x^3 + tan(y));
w = z/(1 + t^2);
F = [w,(1 + t^2)*x/y; (1 + t^2)*x/y,3*z - 1];
matlabFunction(w + z + F,'file','testMatrix.m',...
'vars',[x y t])
출력 변수의 디폴트 이름은 단어 out과 그 뒤에 오는 숫자로 구성됩니다. 다음은 그 예제입니다.
function out1 = testMatrix(x,y,t)
...
출력 변수의 이름을 사용자 지정하려면 output 옵션을 사용하십시오.

syms x y z
r = x^2 + y^2 + z^2;
q = x^2 - y^2 - z^2;
f = matlabFunction(r, q, 'file', 'new_function',...
'outputs', {'name1','name2'})

생성된 함수는 결과로 name1name2를 반환합니다.

function [name1,name2] = new_function(x,y,z)
...