2017-02-15 11 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

2件のコメント。まず、関数の出力に関数そのものを指定するのは悪い習慣です( 'SS関数')。また、 '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) 
関連する問題