ted on: 04.11.2013
* Author: pavel
*/
# include lt; iostream gt;
# include lt; fstream gt;
# include lt; cstdlib gt;
# include lt; cmath gt; float h=.5f;// Часовий крок інтегрірованіяint Tsim=1000/.5f;// Час симуляції в дискретних отсчетахint Nexc=100;// Кількість збуджуючих (excitatory) нейроновint Ninh=25;// Кількість гальмівних (inhibitory) нейронів
const int Nneur=Nexc + Ninh; int Ncon=Nneur * Nneur * 0.1f;// Кількість сязей,
//0.1 це ймовірність зв'язку між 2-ма випадковими нейронаміVms [Nneur] [Tsim];// Мембранні потенціалиUms [Nneur] [Tsim];// Допоміжні змінні моделі ІжікевічаIex [Nneur];// Зовнішній постійний струм прикладений до нейронуIsyn [Nneur];// Синаптичний струм на кожен нейронpre_conns [Ncon];// Індекси пресинаптичних нейроновpost_conns [Ncon];// Індекси постсинаптичних нейроновweights [Ncon];// Ваги связейy [Ncon] [Tsim];// Змінна модулирующая синаптичний струм в залежності від спайков на пресінапсеpsc_excxpire_time=4.0f;// Характерне вермя спадания постсинаптичного струму, мсminWeight=50.0f;// Ваги, розмірність пкАmaxWeight=100.0f;
//Параметри нейронаIex_max=40.0f;// Максимальний прикладений до нейрона струм 50 ПКА
float a=0.02f; b=0.5f;
float c=- 40.0f;// Значення мембранного потенціалу до якого він сбрасиваеться після спайка
float d=100.0f; k=0.5f; Vr=- 60.0f; Vt=- 45.0f;
float Vpeak=35.0f;// Максимальне значення мембранного потенціалу, при якому відбувається скидання до значення сV0=- 60.0f;// Початкове значення для мембранного потенціалаU0=0.0f;// Початкове значення для допоміжної переменнойCm=50.0f;// Електрична ємність нейрона, розмірність пкФ
float spike_times [Nneur * Tsim];// Часи спайков
int spike_neurons [Nneur * Tsim];// Соответвует номера нейронів
int spike_num=0; namespace std; init_connections () {(int con_idx=0; con_idx lt; Ncon;) {
//випадково вибираємо постсіпантіческіе і пресинаптичні нейрони
int pre=rand ()% Nneur; post=rand ()% Nneur; _conns [con_idx]=pre; _conns [con_idx]=post; [con_idx]=(rand ()% (( int) (maxWeight - minWeight) * 10))/10.0f + minWeight;
if (pre gt;=Nexc) {
//якщо пресинаптичний нейрон гальмові то вага зв'язку йде зі знаком мінус
weights [con_idx]=-weights [con_idx];
} [con_idx] [0]=0.0f; _idx ++;
}
} init_neurons () {(int neur_idx=0; neur_idx lt; Nneur; neur_idx ++) {
//випадково розкидаємо прикладені струми [neur_idx]=(rand ()% (int) (Iex_max * 10))/10.0f;
Isyn [neur_idx]=0.0f; [neur_idx] [0]=V0; [neur_idx] [0]=U0;
}
} izhik_Vm (int neuron, int time) {(k * (Vms [neuron] [time] - Vr) * (Vms [neuron] [time] - Vt) - Ums [neuron] [ time] + Iex [neuron] + Isyn [neuron])/Cm;
} izhik_Um (int neuron, int time) {a * (b * (Vms [neuron] [time] - Vr) - Ums [neuron] [time]);
} save2file () {res_file; _file.open ( rastr.csv ); (int k=0; k lt; spike_num; k ++) {_ file lt; lt; spike_times [k] lt; lt; laquo ;; lt; lt; spike_neurons [k] + 1 lt; lt; laquo ;; lt; lt; endl;
} _ file.close ();
//Обчислення середнього по всій мережі мембранного потенціалу в кожен момент часу
//щось на зразок електроенцефалографіі_file.open ( oscill.csv );
for (int t=0; t lt; Tsim; t ++) {Vm_mean=0.0f; (int m=0; m lt; Nneur; m ++) {_ mean +=Vms [m] [ t];
} _ mean /=Nneur; _file lt; lt; t * h lt; lt; laquo ;; lt; lt; Vm_mean lt; lt; laquo ;; lt; lt; endl;
} _ file.close ();
} main () {_ connections (); _ neurons (); expire_coeff=exp (-h/psc_excxpire_time); (int t=1; t lt; Tsim; t ++) {
//проходимо по всіх нейронах (int neur=0; neur lt; Nneur; neur ++) {
Vms [neur] [t]=Vms [neur] [t - 1] + h * izhik_Vm (neur, t - 1); [neur] [t]=Ums [neur] [t- 1] + h * izhik_Um (neur, t - 1); [neur]=0.0f; (Vms [neur] [t - 1] gt; Vpeak) {[neur] [t]=c; [neur] [ t]=Ums [neur] [t - 1] + d; _times [spike_num]=t * h; _neurons [spike_num]=neur;
spike_num ++;
}
}
//проходимо по всіх зв'язках
for (int con=0; con lt; Ncon; con ++) {