기호 표현식에서 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
은 기호 표현식에서 사전순으로 입력 변수를 생성합니다. 이것이 바로 함수 핸들 생성하기에서 함수 핸들에 x
가 y
앞에 있는 이유입니다.
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
, t9
및 t10
)을 재사용하여 결과 코드를 보다 효율적으로 만들 수 있습니다. 중간 변수를 사용하는 것은 표현식을 짧게 유지하여 코드를 더 읽기 쉽게 해 줍니다.
입력 변수를 디폴트 순서인 사전순으로 정렬하지 않으려면 vars
옵션을 사용하여 순서를 제어하십시오. 예제를 계속 보겠습니다.
matlabFunction(F,'file','testMatrix.m','vars',[x y t])
입력값 순서가 다르면서 이전 파일과 동등한 파일을 생성합니다.
function F = testMatrix(x,y,t) ...
출력 변수의 이름 지정하기
기본적으로 출력 변수의 이름은 matlabFunction
을 호출할 때 사용하는 이름과 일치합니다. 예를 들어, 변수 F
로 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(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'})
생성된 함수는 결과로 name1
및 name2
를 반환합니다.
function [name1,name2] = new_function(x,y,z) ...