在Matlab中找到用于仿真的最佳输入 [英] Finding the Optimum Input for a Simulation in Matlab

查看:135
本文介绍了在Matlab中找到用于仿真的最佳输入的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在Matlab中运行以下模拟.在25年的时间里,它模拟根据几何布朗运动增长的资产"和每年以7%的固定速度增长的负债".在模拟结束时,我采用资产与负债的比率,如果该比率大于90%,则试验成功.

I have the following simulation running in Matlab. For a period of 25 years, it simulates "Assets", which grow according to geometric brownian motion, and "Liabilities", which grow at a fixed rate of 7% each year. At the end of the simulation, I take the ratio of Assets to Liabilities, and the trial is successful if this is greater than 90%.

除Sigma(标准偏差)外,所有输入都是固定的.我的目标是找到最低的sigma值,该值将导致每年的资产与负债比率> 0.9.

All inputs are fixed except for Sigma (the standard deviation). My goal is to find the lowest possible value of sigma that will result in a ratio of assets to liabilities > 0.9 for every year.

Matlab中是否有旨在解决此类优化问题的工具?

Is there anything in Matlab designed to solve this kind of optimization problem?

以下代码将仿真设置为sigma的固定值.

The code below sets up the simulation for a fixed value of sigma.

%set up inputs

    nPeriods = 25;
    years = 2016:(2016+nPeriods);
    rate = Assumptions.Returns;

    sigma    = 0.15; %This is the input that I want to optimize

    dt       = 1;
    T        = nPeriods*dt;
    nTrials = 500;
    StartAsset = 81.2419;



%calculate fixed liabilities

    StartLiab = 86.9590;
    Liabilities = zeros(size(years))'
    Liabilities(1) = StartLiab
    for idx = 2:length(years)
        Liabilities(idx) = Liabilities(idx-1)*(1 + Assumptions.Discount)
    end




 %run simulation
    obj = gbm(rate,sigma,'StartState',StartAsset);
    %rng(1,'twister');
    [X1,T] = simulate(obj,nPeriods,'DeltaTime',dt, 'nTrials', nTrials);

 Ratio = zeros(size(X1))

for i = 1:nTrials

 Ratio(:,:,i)= X1(:,:,i)./Liabilities;

end

 Unsuccessful = Ratio < 0.9
 UnsuccessfulCount = sum(sum(Unsuccessful))

推荐答案

首先使您的仿真成为将sigma作为输入的函数:

First make your simulation a function that takes sigma as the input:

function f = asset(sigma)
%set up inputs

nPeriods = 25;
years = 2016:(2016+nPeriods);
rate = Assumptions.Returns;

%sigma    = %##.##; %This is the input of the function that I want to optimize

dt       = 1;
T        = nPeriods*dt;
nTrials = 500;
StartAsset = 81.2419;



%calculate fixed liabilities

StartLiab = 86.9590;
Liabilities = zeros(size(years))'
Liabilities(1) = StartLiab
for idx = 2:length(years)
    Liabilities(idx) = Liabilities(idx-1)*(1 + Assumptions.Discount)
end




%run simulation
obj = gbm(rate,sigma,'StartState',StartAsset);
%rng(1,'twister');
[X1,T] = simulate(obj,nPeriods,'DeltaTime',dt, 'nTrials', nTrials);

Ratio = zeros(size(X1))

for i = 1:nTrials

Ratio(:,:,i)= X1(:,:,i)./Liabilities;

end

Unsuccessful = Ratio < 0.9
UnsuccessfulCount = sum(sum(Unsuccessful))
f = sigma + UnsuccessfulCount
end

然后,您可以使用fminbnd(或对于多个输入使用fminsearch)来找到sigma的最小值.

Then you can use fminbnd (or fminsearch for multiple inputs) to find the minimized value of sigma.

Sigma1 = 0.001;
Sigma2 = 0.999;
optSigma = fminbnd(asset,Sigma1,Sigma2)

这篇关于在Matlab中找到用于仿真的最佳输入的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆