2017-02-15 1 views
1

나는 해결하고자하는 3 개의 미지수에 3 개의 방정식을 가지고 있습니다. 방정식을 symbolic toolbox으로 지정합니다. 나는 solve 함수를 사용하여 matlab에 수치 해결책을 찾도록 요청할 수 있다는 것을 알고있다. 그러나, 3 미지의 3 방정식으로, matlab에 분석 솔루션 (fsolve)를 찾을 수 있어야합니다. 나는 solve 대신 fsolve을 사용할 수 있도록 코드를 변경하는 방법을 모르겠습니다. 내 코드 아래Solve에서 Fsolve까지

은 : 한편 모든

syms Kl Kh alpha nu w phi delta P beta zh zl Ezh Ezl 

nu1 = (1/(1-nu)); 

f1 = ((zl * (Kl^alpha))^nu1 + (zh * (Kh^alpha))^nu1) * nu^(nu*nu1) * (w^(-nu*nu1)) - w/phi + delta*(Kl + Kh)*P 
f2 = Kh - (((1-beta*(1-delta))*P * (w^(nu1*nu))*(nu^(nu*nu1)))/(beta*alpha* (Ezh)^nu1))^((1-nu)/(alpha+nu-1)) 
f3 = Kl - (((1-beta*(1-delta))*P * (w^(nu1*nu))*(nu^(nu*nu1)))/(beta*alpha* (Ezl)^nu1))^((1-nu)/(alpha+nu-1)) 

f1 = subs(f1, {alpha, beta, nu, phi,delta, zh, zl, Ezh, Ezl, P}, {0.27, 0.96, 0.60, 2.15,0.065,1.11687642219068,0.895354204038589,1.07811003137331,0.934120594855956, 0.95}) 
f2 = subs(f2, {alpha, beta, nu, phi,delta, zh, zl, Ezh, Ezl, P}, {0.27, 0.96, 0.60, 2.15,0.065,1.11687642219068,0.895354204038589,1.07811003137331,0.934120594855956, 0.95}) 
f3 = subs(f3, {alpha, beta, nu, phi,delta, zh, zl, Ezh, Ezl, P}, {0.27, 0.96, 0.60, 2.15,0.065,1.11687642219068,0.895354204038589,1.07811003137331,0.934120594855956, 0.95}) 



S = solve([f1 == 0, f2 == 0, f3 == 0],... 
    [w, Kh, Kl], 'ReturnConditions', true); 
+2

'fsolve'은 * 수치 * 솔루션이 아닌 분석 사람을 찾는 데 사용됩니다. 상징적 인 수학 도구 상자에서'solve'는 어떤 경우에는 분석적 해답을 찾을 수 있지만 다른 경우에는 가변적 인 정밀도 수학을 사용하여 숫자를 찾습니다. 숫자 솔루션을 찾으십니까? – horchler

+0

네, 사과드립니다. 나는 수치적인 해결책을 의미했다. – phdstudent

답변

0

분명히 나는 ​​해결책을 찾아 냈다.

function SSfunction = SSfunction(x) 


syms alphaa nu phi delta p betaa zh zl ezh ezl 

nu1 = (1/(1-nu)); 

f1 = ((zl * (x(3)^alphaa))^nu1 + (zh * (x(2)^alphaa))^nu1) * nu^(nu*nu1) * (x(1)^(-nu*nu1)) - x(1)/phi - delta*(x(3) + x(2))*p; 
f2 = x(2) - ((betaa*alphaa*(ezh^(nu1)) * (nu^(nu*nu1)))/((1-betaa*(1-delta))*p* (x(1)^(nu*nu1))))^((1-nu)/(1-alphaa-nu)); 
f3 = x(3) - ((betaa*alphaa*(ezl^(nu1)) * (nu^(nu*nu1)))/((1-betaa*(1-delta))*p* (x(1)^(nu*nu1))))^((1-nu)/(1-alphaa-nu)); 

f1 = subs(f1, {alphaa, betaa, nu, phi,delta, zh, zl, ezh, ezl, p}, {0.27, 0.96, 0.60, 2.15,0.065,1.11687642219068,0.895354204038589,1.07811003137331,0.934120594855956, 0.950}); 
f3 = subs(f1, {alphaa, betaa, nu, phi,delta, zh, zl, ezh, ezl, p}, {0.27, 0.96, 0.60, 2.15,0.065,1.11687642219068,0.895354204038589,1.07811003137331,0.934120594855956, 0.950}); 
f2 = subs(f1, {alphaa, betaa, nu, phi,delta, zh, zl, ezh, ezl, p}, {0.27, 0.96, 0.60, 2.15,0.065,1.11687642219068,0.895354204038589,1.07811003137331,0.934120594855956, 0.950}); 



SSfunction(1) = eval(f1) 
SSfunction(2) = eval(f2) 
SSfunction(3) = eval(f3) 


end 

x0 = [1,2,0.7]; 
fun = @SSfunction; 
x = fsolve(fun,x0) 
+0

두 개의 댓글입니다. 첫째, 일반적으로 함수의 출력을 함수 자체와 동일한 이름으로 지정하는 것은 나쁜 습관입니다 ('SSfunction'). 또한,'fsolve' 최적화가 목적 함수를 호출 할 때마다 기호식이 부동 소수점으로 변환되기 때문에이 솔루션은 비효율적입니다. 아주 특별한 경우에이 방정식에 중요성이나 기타 수치 문제가있는 경우이 방법이 유용 할 수 있습니다. 그것은 여기에있는 것처럼 보이지 않습니다. – horchler

1

사용 matlabFunction 직접 fsolve에서 사용할 수있는 벡터화 된 숫자 기능에 상징적 인 표현을 변환 할 수는 :

... 
f = matlabFunction([f1;f2;f3],'Vars',{[w;Kh;Kl]}); 

w0 = 1; 
Kh0 = 1; 
Kl0 = 1; 
x0 = [w0;Kh0;Kl0]; 
x = fsolve(f,x0) 

이의 순서가 될 것입니다 여기에

완료에 대한 코드입니다 크기는 fsolve에서 기호 식 자체를 사용하는 것보다 빠릅니다. 더 빠른 속도를 위해, 당신은 또한 단지 전체 수동 기능을 벡터화에 의해 상징적 인 수학을 없애 수 :

alpha = 0.27; 
beta = 0.96; 
nu = 0.6; 
phi = 2.15; 
delta = 0.065; 
zh = 1.11687642219068; 
zl = 0.895354204038589; 
Ezh = 1.07811003137331; 
Ezl = 0.934120594855956; 
P = 0.95; 
nu1 = (1/(1-nu)); 

f = @(w,Kh,Kl)[((zl * (Kl.^alpha))^nu1 + (zh * (Kh.^alpha))^nu1) * nu^(nu*nu1) .* (w.^(-nu*nu1)) - w/phi + delta*(Kl + Kh)*P; 
       Kh - (((1-beta*(1-delta))*P * (w.^(nu1*nu))*(nu^(nu*nu1)))/(beta*alpha* (Ezh)^nu1))^((1-nu)/(alpha+nu-1)); 
       Kl - (((1-beta*(1-delta))*P * (w.^(nu1*nu))*(nu^(nu*nu1)))/(beta*alpha* (Ezl)^nu1))^((1-nu)/(alpha+nu-1))]; 

w0 = 1; 
Kh0 = 1; 
Kl0 = 1; 
x0 = [w0;Kh0;Kl0]; 
x = fsolve(@(x)f(x(1,:),x(2,:),x(3,:)),x0)