File Exchange

image thumbnail


version 4.0.6 (3.18 MB) by milan batista
Estimation of coronavirus COVID-19 epidemic evaluation by the SIR model


Updated 03 Apr 2020

View License

The function fitVirusCV19 implements the susceptible-infected-recovered (SIR) epidemic model for the estimation of epidemy evaluation. It is assumed that the model is a reasonable description of the one-stage epidemic. In particular, the model assumes a constant population, uniform mixing of the people, and equally likely recovery of infected. The model is data-driven, so its forecast is as good as data are. The forecasting change with new or changed data. The officially declared outbreak of the epidemic and the outbreak of the epidemic as it reported by the program have nothing to do with each other. The program indicates the start date when the data is sufficient to calculate the initial approximation.

The parameters of the model are obtained by minimization of the objective function, which is the sum of squares for residuals of values and sum of squares for residuals of values differences. The weights of summands are selected automatically. Optimization Toolbox function fminsearch is used to calculate optimal values of unknown model parameters. If the calculation fails then only data are plotted.

The contribute contains data for coronavirus for Argentina, Austria, Belgium, Brazil, Canada, Croatia, China, Czech Republic, Denmark, Germany, Hungary, France, India, Indonesia, Iran, Italy, Japan, Lombardia, Netherlands, NY State, Norway, Poland, Portugal, Slovakia, Serbia, Slovenia, South Korea, Spain, Switzerland, UK, USA and data for outside of China (up to 28.Mar.2020)

On the epidemy evaluation graph, regions color separate epidemy phases (these are not standard but arbitrarily chosen for convenience):
red - fast growth phase
yellow - transition to steady-state phase
green - ending phase (plateau stage)

Results are saved in structure res (see function fiVirusCV19 header). Optionally the results may be printed by


When regression fails then only data are plotted. Population size is limited to 12 Mio. You can change the upper limit by name/value pair:


Use this option if the final prediction is too high or exceed the country's population.

Function analyseCV plots a graph of evaluation of R0 (basic reproduction number), Cend (epidemic size), N (initial susceptible population size). To analyze data for country XXX from 10 days of epidemic onward use


DISCLAIMER: Software and data are for education and not for medical or commercial use. The model may fail in some situations. In particular, the model may be inadequate; the model may fail in the initial phase and in when additional epidemic stages or outbreaks (not described by SIR model) are encountered. Use it at your own discretion.
The data are only for demonstrating the operation of fitVirusCV19. FitVirus and presented demo data are only for educational and academic purposes and should not be used for medical purposes and in commerce. They are provided as is and any express or implied warranties, including but not limited to implied warranties of merchantability and fitness for a particular purpose are disclaimed.

Source of data
An actual source of data is for each country reported in the corresponding getData function.

NEW: importData function read and generate data from ourworldindata data file.

A more detailed description can be found in
Examples can be found in

Cite As

milan batista (2020). fitVirusCOVID19 (, MATLAB Central File Exchange. Retrieved .

Comments and Ratings (43)

It requires fminsearch function either from Optimization or Statistic Toolbox. Symbolic Tbx is optional because fitVirusCV19 has a function to calculate lambertw .

Does anyone was able to run it in Octave ? I seems to get stuck inside ode45() and it never terminates.

Anyway, for Matlab it requires the Optimization, Symbolic and Statistics Toolbox

No, N is not the country's population. N is a population composed of susceptibles (S), infected (I) and recovered (R). And the cases in the diagram are I+R. It is assumed that N=S+I+R=const. So N is approximately equal to the initial size of susceptibles because the initial number of infected is small. And this is, of course, one of the unknowns of the model (otherwise we could collect susceptibles and put them into quarantine). When there is no quarantine then N can increase every day (you may have a new local outbreak inserted from outside and thus N increase), with quarantine it steadily becomes a constant i.e. with quarantine the assumptions of the model are more fulfilled and thus the model becomes more suitable for forecasting (you obtain the same curve every day).

Dear Milan

Great work! There is something I am missing here, though. N is the population of the country, right? In all of your examples N is significantly lower than the actual population. Why is that? Thanks in advance.

Weights are not ment to be plotted (these are just two numbers). You can see their values on print, or you can set their value as described in readMe.m in folder CV19.

Hey Milan
Can you please describe or how to plot the weights (w1 & w2) used on each simulation?

dong gretch

Thanks for the explanation. will consider trimming

As said in the description, the regression can fail especially in the early stage of the epidemic or if there are more outbreaks. The model is not adequate for such situations. Sometimes trimming of initial data improve regression conditions but sometimes not.
The updated data for various countries are available at the links listed above.

dong gretch

Hi. I got this error after I updated the ow_getDataPhilippines for Philippines. It says
Fail to obtain parameters for Philippines.
ini: beta = 1.02974 gamma = 0.686495 N = 5333.72 I0 = 1.78765
calc: beta = 0.00876042 gamma = -0.267236 N = 44594.5 I0 = 83.4033

dong gretch

Any updated get data for Philippines?

dong gretch

Hi it says "Fail to obtain parameters for Indonesia" how to correct pls

Ayad mhamed

Ayad mhamed

merci pour votre contribution 🙂

Thank you!

milan batista

Just delete it. It is Matlab export of Report... to MS Word .


I can´t open the report named as '~$portAll200327.docx'

Thank you, Mr. Milan Batista for updating Japan. Very much apreciated.
If it is not troubling you, I hope that you update the oceanian country such us Australia, South East Asia such Singapore, East Asia such as Taiwan too.
Sorry to ask you so many.
Hope that you are in health.

Very nice work, including on the extensive list of retrieval functions!

I am suggesting the addition of explicit limitations, as well as some graphing and presentation items, and will communicate with the author these suggestions.

milan batista

I add lamberw function for those who don't have SMTbx. Please test the program. I also add the importData function which generates input function from ourworldindata's total_cases file. (save csv as xlsx first !). These data functions begin with ow_getDataXXXX.

Hi, it requires also "'lambertw' requires Symbolic Math Toolbox."


thank you Mr. Milan
I hope to find update for Indonesia


thank you for your update, Mr. Milan.
I wonder if you can add egypt data too

milan batista

The officially declared outbreak of the epidemic and the outbreak of the epidemic as is indicated by the program have nothing to do with each other. The program reports the start date when the data is sufficient to calculate the initial approximation.

The second bar graph is not a cumulative but a daily increase in infections. The data used are mostly from Wikipedia.

Sir, can you please guide as to why initial date for some of your analysis was chosen differently, for example in the getDataIndia(),
2020/03/03 is the model start date, however COVID-19 started on 30-Jan-2020 in India.
Second query is regarding discontinuity in cumulative case column. The cases occurred on different dates, however same is not reflected in getData files. Will you please guide and comment on this?

Great work.

thank you for your update, Mr. Milan.
I wonder if you can add Japan, Australia, New, Zealand data too.

thank you for the update,Mr.Milan. very much appreciated

thank youuu so much Mr.Milan for having the data for Indonesia. highly appreciated. thank you so so much. i will follow the data everyday. please do keep updating (for i know nothing about programming and computer) thank you so much and i'm looking forward to download your latest data everyday. keep up the good work and stay healthy, Mr.Milan. God bless

milan batista

The new upgrade contains data for Canada (thanks to Remy Boisse), Indonesia (thanks to Maldiku Servinu) and Serbia.

thank you so much Milan for the help. i'm actually really new at this matlab program. so first,must i download the application and install matlab to my computer?
so sorry for asking such a really basic question, i'm just trying to help people around me to get an insight of what is going on

Remy Boisse

Very nice program, I made a getData function for Canada if any of you are interested.

milan batista

To Maldiku. Just enter data for Indonesia from
in some getData function and run the program.

milan batista

There is an option (see the function header) to increase the number of iterations if the output code is 0, but if the graph is good I would leave that option alone. Namely, error condition 1 can be obtained by increasing the no. of iterations or we increase the tolerance of the solution. As the number of iterations increases, the solution may begin to diverge.

hello there,Milan,this is really interesting and i really really appreciate what you've done here. really help us to estimate or predict this pandemic.
would you mind making for my country Indonesia as well,please? would really appreciate it so so much. thanks

Printing results, this outputs "Exit condition (1=OK)"; should that be "0=OK"?

milan batista

OK I see, you didn't run my code but Joshua McGee version of code.

excellent work, but when I run the code it gives me this error:
Unrecognized property 'PreserveVariableNames' for class
Error in fitVirusCV19v3 (line 132)
opts.PreserveVariableNames = true;



Change image


update regression algorithm. By default, the solution with min N is selected (optimistic approach). Add Iceland and Sweden. Update data (2.4.2020)


Change image


More minor changes


Minor corrections


Add the check data folder (thanks to Rolf Boelens). Add two utility programs in folder PLA (thanks to Patrick Anderson)


Major revision. Add flambertw for those who have no SMTbx. Add importData function.


Update description


Update description


Update description


Update analyseCV19


More minor corrections


Minor corrections


Add analyseCV19. Update data, add Czech Republic, Japan, Slovakia


Change image with today predictions in Lombardia


Improve initial data trim. Add data for Brazil, India, and Poland.


Correct description


Add address of data source


Add data for Canada (thanks to Remy Boisse) , Indonesia (thanks to Maldiku Servinu) and Serbia. Upgrade description.


Update description


Update description


Update data. Add Hungary and NY State


Correct data


Add new data


Add data for NYState. Add the option for controlling the number of iterations.


Add data for Denmark and Norway. Data are now automatically trimmed. Weights are now selected automatically. Minor corrections.


Delete duplicate examples


Minor corrections. Add data for Croatia and UK


Correct graphs


Minor corrections


Correct description


Improve print and initial guess function. Add data for Lombardia.


edit description

MATLAB Release Compatibility
Created with R2020a
Compatible with any release
Platform Compatibility
Windows macOS Linux





fitVirusCV19_v07_v5/data checked mar26