https://stackoverflow.com/questions/5846939/difference-between-fzero-and-fsolve-for-one-variable
Difference between fzero and fsolve for one variable
Is there a difference between using fzero and fsolve for a single variable equation?
stackoverflow.com
https://www.mathworks.com/help/matlab/ref/fzero.html?searchHighlight=fzero&s_tid=srchtitle
Root of nonlinear function - MATLAB fzero
You have a modified version of this example. Do you want to open this example with your edits?
www.mathworks.com
https://www.mathworks.com/help/optim/ug/fsolve.html
Solve system of nonlinear equations - MATLAB fsolve
You have a modified version of this example. Do you want to open this example with your edits?
www.mathworks.com
다이네어 dynare를 가지고 연습하면서 간단히 3쪽 정도하는 논문을 써볼까 하면서 한 두달 정도로 계획하고 논문을 시작했는데, 일이 생각보다 커지고 있다. 물론 내가 멍청한 탓이다. 지금 내가 알고 있는 것을 처음부터 알았더라면 이렇게 질질 끌면서 쓰고 있지는 않을 것이다. 어쩌면 애저녁에 포기했어야 하는 것인지도 모른다. 내 포텐셜로 턴아웃이 180이 안되듯이 이 논문도 아이디어는 쉬워보이지만 내 실력으로는 닿지 않는 그런 영역에 있는 것인지도. 사실은 한 달째에 결과가 마음에 들게 딱 나왔는데 검산하다가 보니까 내가 암산할 때 실수해서 그런 것이었다. 참고로 논문을 쓰다가 틀리는 사람들은 부지기수다. 오늘은 JoF에 실린 논문 retract 한 것도 봤는데 이건 다음 포스팅에 써보겠음.
뭐 어쨌든, 안풀리는 덕택에 이것저것 많이 배우고 있다. 다이네어 코드를 하루종일 들어다보기를 몇 달째라 이제 눈감고도 코드를 아주 간단한 모델은 처음부터 내가 쓸 수도 있을 것 같다. (모방은 창조의 어머니라고 하니 그렇다면 Johannes Pfeifer가 나의 다이네어 엄마 ㅋㅋ) 이제는 스테디스테잇 steady state 계산을 dynare 메인 파일에서 벗어나서 따로 m 파일로 만들어서 하는 것도 배웠다.
원래 다이네어 메인파일을 돌릴 때는 스테디스테잇을 손으로 풀어보고, 거기에 더하여 impulse response를 그래프로 구현하는 용도 정도로 생각하는 게 좋다. 하지만 모델이 복잡하고 커지면 손으로 풀어보는 게 불가능할 수 있는데 (혹은 내가 멍청해서 불가능해보이는 것도 해당됨... 어쨌든 손으로 풀어질 것 같지 않아 보이거나 풀기 싫을 때 ㅋ ) 이때 수치적 방법으로 풀어볼 수 있다. 그냥 가능한 모든 숫자를 다 넣어보고 맞는 것 찾아내는 것임. 무식한 방법이지만 컴퓨터는 불만없이 해낸다.
메인이름_steadystate.m 파일 안에서는 주로 스테디스테잇을 뉴메리컬 numerical로 푸는 코딩이 들어가게 된다. 이때 메틀랩의 다양한 함수들을 마음껏 이용할 수 있는데, 특히 fsolve 와 fzero 두 가지가 인기있는 함수인 듯 하다. fzero는 x^3 같이 함수가 x축을 뚫는 경우, x축 절편을 구해낸다. 멀티플 솔루션일때는 뭘 주는지 모르겠음. 매틀랩 홈페이지에 올라와 있는 예시도 3차함수인 것이 있다.
function y = f(x)
y = x.^3 - 2*x - 7;
itsfun = @f; % function
x0 = 3; % initial point
mysolution = fzero(itsfun,x0)
이런 예시를 주었음. 잘 보면 fzero 안에 들어가는 input argument가 함수 f 가 아니라 핸들링된 상태의 함수 @f 이다. 위의 예시에서는 별 차이가 없지만, 변수가 2개 이상이 되는 경우, 둘 중 하나는 파라미터/상수로 처리해주고, 그 다음에 1변수 함수로 핸들링 한 뒤에 fzero에 넣어주어야 한다.
mylovelyfun = @(x,k) exp(k*x); % parameterized function
k = 2; % parameter
itsfun = @(x) mylovelyfun(x,k); % function of x alone
x = fzero(itsfun,0.1)
한편 fsolve는 함수가 x축을 살짝 접하고 지나가는 경우, 즉 x^2 같이 생긴 애들이 x축에 접하는 값을 구하는 것으로 보인다. 비선형 non-linear 함수들의 해를 구할 때 편리하고, 대충 이정도 값이면 솔루션이라고 치겠다... 라고 할 때도 편리하다. tolerance level을 설정하고 변경하는 것이 가능하다. 그만큼 내가 control 할 수 있는 범위가 넓은데, 그 대신에 귀찮은 일이 많아지는 것 같아보임.
+ 추가:
fzero는 일변수 함수에만 사용 가능하다. 추정되는 해 값의 범위가 있으면 초기값 대신 범위를 넣어줄 수 있고, 이렇게 하는 것이 더 빠르다.
fsolve는 다변수 함수들의 연립방정식에 사용 가능하다.
function soln_row = root2dim(x)
% two unknowns and two equations
x1 = x(1);
x2= x(2);
soln_row(1) = exp(-exp(-(x1 +x2) ) ) - x2 *(1+x1^2);
soln_row(2) = x1*cos(x2) + x2*sin(x1) - 0.5;
이걸 매틀랩 파일로 따로 저장한 뒤 아래와 같은 command를 메일 파일에 넣어준다
itsfun = @root2dim;
initial_row = [0,0];
x = fsolve(itsfun, initial_row)
역시 function handle로 넣어줘야 함에 유의하자. 해는 row로 나온다.
x = 0.3532 0.6061
(위에서 하이퍼링크 된 매틀랩 fsolve 다큐먼트에서 데려온 예시임)
multi variable function이 된다고는 하는데 몇 개까지 되는지는 모르겠다. 16개짜리... 될라나?
이 외에 vpasolve 라는 것도 있다. 심볼(들)을 정하고 그 심볼(들)을 변수로 해서 해를 구해주는 것인데 다이네어는 아직 소화를 못한다. 다이네어가 스테디스테잇 없다고 지랄할 때 진짜 없나 뼁끼치는 건가 확인하는 용으로 쓰기에만 적절하다 (2021년 여름 현재). 다이네어 새끼... 컴퓨터도 내 멍청함에 불만을 표시하네...
코드는 간단하다
syms x
solution = vpasolve(x^3 == 0, x)
이런 식으로 하면 solution으로 방정식을 만족하는 수치해가 나온다.
https://www.mathworks.com/help/symbolic/sym.vpasolve.html
Solve equations numerically - MATLAB vpasolve
You have a modified version of this example. Do you want to open this example with your edits?
www.mathworks.com
-----------------
파이딴 python을 배우고 있었더니 매틀랩 function이 어떻게 쓰는 것이었는지 미묘하게 헷갈린다
python은
def blahblah(input_argument):
pass
return output_argument
이렇게 function 을 선언했을 때 :(콜론-정색하는 눈) 꼭 찍어줘야 하고, 함수 정의는 꼭 indent를 하고 써야 한다. 둘 다 잘 해야지 아니면 error 난다
매틀랩 MATLAB 은 위에서 보듯이
function y = f(x)
y = x.^3 - 2*x - 7;
함수 정의에서 indent가 필요없고 대신에 정의하고 무조건 ; (세미콜론이다-윙크하는 눈) 찍어줘야지, 안그러면 함수 돌아가면서 내용물 다 토해내서 스크린 미쳐돌아감 ㅎㅎ error가 나는 건 아니다
'본업' 카테고리의 다른 글
JoF retracted paper 관련 (0) | 2021.07.07 |
---|---|
msft amzn을 보면서 배우는 인생 (0) | 2021.07.07 |
포아송 엑스포넨셜: 금융사고의 확률과 다음 사고까지의 예상간격 (0) | 2021.07.03 |
inequality and recession (0) | 2021.07.02 |
맹모삼천지교의 증명 (0) | 2021.07.02 |