Wesser
Wesser

Reputation: 13

Parameter Optimization in MATLAB

I am trying to arrive at the optimal parameter set for Scf, TT, C, B. I have read through some articles on where and how to do this in MATLAB, but they just seem so confusing and the examples don't transfer to my code...or don't seem to. I would very much appreciate some guidance on what the additions to my code should look like. How do I ask MATLAB to minimize the objective functions between observed snow water equivalent values and estimated? These variables obviously must stay within certain ranges, so how do I present this in my code?

%Degree-day method for snow melting.
%Data from the ... Switzerland

x=load('C:\n.dat'); %Load the file with data
td=x(:,4);              %hour of the day
GlobalRad=x(:,5);          %Global Radiation
T=x(:,6);                %Air Temperature
P=x(:,7);                %Precipitation
Snow_obs=x(:,8);           %SWE Observed
SnowDepth=x(:,9);        %Snow Depth Observed
ts=x(:,10);                %start time of daylight on day d (t0)
te=x(:,11);               %end time of daylight on day d (t1)
dTd=x(:,12);              %difference between the max and min daily temperatures on day d

snow_sim(1)=0;
runoff=zeros(length(P));

%Parameters (TO BE CALIBRATED)
Scf=1.3;                        %Snowfall correction factor
TT=1;                          %Threshold temperature
C=3.5;                           %Degree-day factor (mm day-1 C-1)(Ac)
B=0.05;         % Factor to convert the temp amplitude into a degree day factor

%Parameters (USE DEFAULT)
Cfr=0.05;                        %Refreezing coefficient (use default value of 0.05)
Cwh=0.1;                         %Water holding capacity (use default value of 0.1)



snow_sim(1)=0;                   %Simulated snowpack is 0 mm for day 1
snow_sim_water(1)=0;             %Liquid water in snowpack for day 1 the water is 0 mm


for t=1 : length(td);       %time series loop

    ln(t)=24-te(t)+ts(t);                    %length of the night
    Z(t)=2*((te(t)-ts(t))/(3.14*ln(t)));        %factor ensuring that daily mean vaules of As equals Ac

    if ts(t)<=td(t)<te(t);

      As(t)=C+(B*dTd(t)*(sin(3.14*((td(t)-ts(t))/(te(t)-ts(t))))));       %equation for time variant degree day factor scenario 1

    else As(t)=C-(B*dTd(t)*Z(t));            %equation for time variant degree day factor scenario 2

    end
end

as=As';         % transpose As from a row to a column vector
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%



for t=2 : length(P);             %time series loop
    if T(t)< TT;                 %If the temperature for day t is lower than the threshold value for melting (=below TT degrees) then refreezing of melt water will occur
        refreez(t)=Cfr*as(t)*(TT-T(t));      %Equation for refreezing of meltwater
        if refreez(t) > snow_sim_water(t-1);     %If the refreezing for day t is larger than the water in the snowpack the day before, then the refreezing is limited
            refreez(t)= snow_sim_water(t-1);      %Can't freez more water than is accumulated in the snowpack
        end

        snow_sim(t)=P(t)*Scf+snow_sim(t-1)+refreez(t);     %The total simulated snowpack for any given day is the precipitation that day together with snow pack from day before and refreeze of that day.
        snow_sim_water(t)=snow_sim_water(t-1)-refreez(t);        %The total simulated amount of water in the snowpack is the water in the snowpack the day before minus the water refrozen the same day


    else %T(t) > TT                   %temperature above threshold temperature, snowmelt will occur
        Melt(t)=as(t)*(T(t)-TT);           %Equations for melting rate of existing snowpack
        if Melt(t) > snow_sim(t-1);    %If the melting rate for day t is larger than the snowpack the day before, then the melting is limited
            Melt(t)= snow_sim(t-1);     %Because it can't melt more snow than is available
        end
        snow_sim(t)=snow_sim(t-1)-Melt(t);                  %Total simulated snow is the simulated snowpack for the day before minus the melted snow
        snow_sim_water(t)=snow_sim_water(t-1)+P(t)+Melt(t);       %Total water amount in snow is the water amount in snow for the day before plus the precipitation and the melted snow
        if Cwh*snow_sim(t) < snow_sim_water(t);                 %The snowpack can retain as much as 10% of its water equivalent, but not more
            runoff(t)=snow_sim_water(t)-0.1*snow_sim(t);        %if there is more liquid water, this goes to runoff (note:if there is no snowpack all water will go to runoff
            snow_sim_water(t)=0.1*snow_sim(t);
        end
    end
end

snow_sim_total=snow_sim+snow_sim_water;                   %The total simulated snowpack is the water in snow and the simulated snowpack

daynr=1:length(P);

Upvotes: 0

Views: 291

Answers (1)

Saman
Saman

Reputation: 777

As somebody else mentioned above, your code is pretty long to track in here. However, I have some suggestions for you. In general, when you are going to optimize several parameters (hyper parameters), you need to change their values, evaluate the output (i.e. calculate an error in the output). You need to keep in mind that, you change one value per run and keep other parameters fixed (constant). As you have in your code, this process has to be done in a loop (for loop). Finally, you will create some figures/tables to see where the optimized parameters have been achieved. If you use any error, the optimized parameters are minimizing the error. Let's say for a particular C and B ... the error is minimum. Hope it helps.

Upvotes: 1

Related Questions