查找效用函数U(h1,h2)的最大值 [英] Find maximum of a utility function U(h1, h2)
问题描述
我有一个matlab函数,该函数返回效用值U(h1, h2)
,该值取决于两个人h1
和h2
的工作时间.每个人最多可以工作3500小时.
I have a matlab function that returns the utility value U(h1, h2)
that depends on the number of work hours for two persons h1
and h2
. Each person can work at maximum 3500 hours.
如何以最佳方式编写此代码?对于只有一个人,我只将函数从输入值0到3500循环到一个矩阵中,然后在矩阵中找到最大值.但是现在我有两个值,可以取0到3500之间的值,并希望根据这些值找到函数的最大输出.
How do I write this code in the best way? For only one person I only loop the function from input value 0 to 3500 into a matrix and find the max value in the matrix. But now I have two values that can take the value 0 to 3500 and want to find the max output from the function based on these values.
我将非常感谢您的帮助!
I would be very grateful for any help!
对不起,迟到了!到目前为止,我还没有时间对此进行研究.无论如何,这是代码:
edit: Sorry for late return! I haven't had time to look in to this until now. Anyway, here is the code:
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
推荐答案
您可以使用两种方法来解决您的问题:
You can use two approaches two solve your problem:
-
生成2D网格并找到全局最大值
Generate a 2D mesh and find the global maximum
[h1, h2] = meshgrid(0:100:3500);
Uoptimal = max(max(U(h1, h2))
使用多元最小化求解器,例如 fmincon
Use a multivariate minimisation solver, such as 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
相同.
Note that I minimise -U
, which is the same as maximising U
.
方法1将为您提供全局最大值,但获得准确结果的速度相当慢.方法2非常准确,但可能会停留在局部最大值上,具体取决于起始值和效用函数U
的凸度.
Approach 1 will give you the global maxima, but is rather slow for obtaining an accurate result. Approach 2 is very accurate, but may get stuck at a local maxima, depending on the start value and the convexity of your utility function U
.
这篇关于查找效用函数U(h1,h2)的最大值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!