2017-05-01 14 views
0

私はとh2の2人の勤務時間数に依存するユーティリティ値U(h1, h2)を返すmatlab関数を持っています。各人は最大3500時間で作業できます。ユーティリティ関数の最大値を見つける

このコードをどのようにして最良の方法で書くことができますか?私は1人の人のために、入力値0から3500までの関数を行列にループし、行列の最大値を求めます。しかし、今私は0から3500の値を取ることができ、これらの値に基づいて関数から最大出力を探したいと思う2つの値があります。

私はどんな助けでも非常に感謝しています!

編集: ごめんなさい!私は今までこれを見る時間がなかった。

function Test 

global LocalTaxRate 
global StateTax1Rate 
global StateTax2Rate 

LocalTaxRate = 0.3212; %Average 2017 
StateTax1Rate = 0.25; 
StateTax2Rate = 0.05; 

h = [0 0]; % start value 
lb = [0 0]; % lower bound of h 
ub = [3500 3500]; % upper bound of h 
myFun = @(h) -CalcUFamily(h(1), h(2)); % function to minimize with one input 
Uoptimal = fmincon(myFun, [1000 1000], [], [], [], [], lb, ub) 

end 

function UFamily = CalcUFamily(hh,hw) %h = male, w = wife 

(bunch of code until this step, which is the relevant one) 

YearlyWorkIncomeHusband = WageHH * hh; 
    C = YearlyWorkIncomeHusband + MonthlyTaxableTransfers * 12 - CalcTaxSwe(YearlyWorkIncomeHusband + MonthlyTaxableTransfers * 12, YearlyWorkIncomeHusband, Age) + MonthlyNonTaxableTransfers * 12; %Netincome husband 
    YearlyWorkIncomeWife = WageHW * hw; 
    C = C + YearlyWorkIncomeWife + MonthlyTaxableTransfers * 12 - CalcTaxSwe(YearlyWorkIncomeWife + MonthlyTaxableTransfers * 12, YearlyWorkIncomeWife, Age) + MonthlyNonTaxableTransfers * 12; %Netincome husband + wife 

    UFamily = alpha1 * log10(C/100000) + alpha11 * (log10(C/100000)^2) ... 
     + alpha2 * (log10(T/1000-hh/1000)) + alpha22 * (log10(T/1000-hh/1000))^2 + alpha12 * log10(C/100000) * (log10(T/1000-hh/1000)) * 2 ... %husband 
     + alpha3 * (log10(T/1000-hw/1000)) + alpha33 * (log10(T/1000-hw/1000))^2 + alpha13 * log10(C/100000) * (log10(T/1000-hw/1000)) * 2 ... %wife 
     + alpha23 * (log10(T/1000-hh/1000)) * (log10(T/1000-hw/1000)) ... %common leisure parameter 
     - alpha4 * Psa - bfc * Dw; %Dummies 
end 
+0

あなたが何を求めているのか分かりません。 – excaza

+0

私は以下のような関数を持っています:max U(h1、h2) ここで、h1は勤務時間person 1とh2勤務時間person 2. h1とh2の限界に基づいてU(h1、h2) h> _ 0、h <_3500 – KGB91

答えて

1

はあなたの問題を解決するための二つのアプローチ2を使用することができます:とにかく、ここのコードです

  1. が2Dメッシュを生成し、見つけるグローバル最大

    [h1, h2] = meshgrid(0:100:3500); 
    Uoptimal = max(max(U(h1, h2)) 
    
  2. 使用fmincon

    h = [1000 1000]; % start value 
    lb = [0 0]; % lower bound of h 
    ub = [3500 3500]; % upper bound of h 
    Uoptimal = fmincon(@(h1, h2) -U(h1, h2), h, [], [], [], [], lb, ub); 
    
    などの多変量最小化ソルバー

    -Uを最小化します。これは、Uを最大化するのと同じです。

アプローチ1はあなたのグローバル最大値を与えるが、正確な結果を得るためにかなり遅います。アプローチ2は非常に正確ですが、あなたのユーティリティ関数Uの開始値と凸性に応じて、極大値で停止することがあります。

+0

ありがとう、私はそれを試してみよう! :) – KGB91

+0

ご迷惑をおかけして申し訳ありません!私は働く機能を持っていない。私は別々の関数 'function UFamily = CalcUFamily(hh、hw)'(hh =勤務時間の夫とhw =勤務時間の妻)を持っており、UFamilyが最大の価値を得るようにhwとhhを選択することで最大化したい。しかし、私があなたのコードを使ってうまく動作しないときは、: どうしたらいいですか? – KGB91

+0

'U 'を' CalcUFamily'に置き換えるとうまくいくでしょう。 – m7913d

関連する問題