Диссертация (Разработка и исследование электрогидравлического привода с раздельным управлением группами поршней), страница 15
Описание файла
Файл "Диссертация" внутри архива находится в папке "Разработка и исследование электрогидравлического привода с раздельным управлением группами поршней". PDF-файл из архива "Разработка и исследование электрогидравлического привода с раздельным управлением группами поршней", который расположен в категории "". Всё это находится в предмете "технические науки" из Аспирантура и докторантура, которые можно найти в файловом архиве МГТУ им. Н.Э.Баумана. Не смотря на прямую связь этого архива с МГТУ им. Н.Э.Баумана, его также можно найти и в других разделах. Архив можно найти в разделе "остальное", в предмете "диссертации и авторефераты" в общих файлах, а ещё этот архив представляет собой кандидатскую диссертацию, поэтому ещё представлен в разделе всех диссертаций на соискание учёной степени кандидата технических наук.
Просмотр PDF-файла онлайн
Текст 15 страницы из PDF
Н.Э. Баумана, 2015. 335 с.41.Фомичев В.М. Проектирование электрогидравлических усилителеймощности следящих приводов: учебное пособие. Москва: ИздательствоМГТУ им. Н.Э. Баумана, 2009. 44 с.42.СеменовС.Е.Электромеханическиепреобразователиэлектрогидравлических следящих приводов: учебное пособие по курсу«Электроавтоматика». Москва: Издательство МГТУ им. Н.Э. Баумана,1998. 35 pp.43.СеменовС.Е.Аналоговоеустройствоуправленияэлектрогидравлическим следящим приводом на основе операционных132усилителей: учебное пособие. Москва: Издательство МГТУ им. Н.Э.Баумана, 2008.
31 с.44.Kulakov D.B., Semenov S.E., Kulakov B.B., Shcherbachev P.V., Tarasov O.I.Proceedings of the 2nd International Conference on Dynamics andVibroacoustics of Machines (DVM2014) // Hydraulic bipedal robots locomotionmathematical modeling. Samara. 2014. Vol.
106. pp. 62-70.45.ФомичевВ.М.Проектированиецилиндрическихзолотниковыхраспределителей следящих электрогидравлических приводов: учебноепособие. Москва: Издательство МГТУ им. Н.Э. Баумана, 2009. 23 с.46.Звягинцев С.С., Адельшин Д.Р. Опыт создания лабораторного стенда дляисследования рабочего процесса поршневого насоса // Молодежныйнаучно-технический вестник - 2015 - №10. 2015.
URL: http://sntbul.bmstu.ru/doc/813594.html (дата обращения: 16.11.2016).47.Frictioninhydrauliccylinders[Электронныйресурс]//www.mathworks.com: [сайт]. [2016]. URL: https://www.mathworks.com/help/physmod/hydro/ref/cylinderfriction.html?searchHighlight=friction&s_tid=doc_srchtitle(датаобращения: 20.декабрь.2016).48.Андреев М.А.
Способ регулирования пневмогидравлической подвескимногоосноготранспортногосредствасизменяемойупругойхарактеристикой: дис.. канд. техн. наук: 05.05.03 Колесные и гусеничныемашины, 05.04.13 Гидравлические машины и гидропневмоагрегаты.Москва. 2014. 175 с.49.Решетников Е.М., Саблин Ю.А., Григорьев В.Е., Мрочковский Н.Н.,Сосульников Г.Б. Электромеханические преобразователи гидравлическихи газовых приводов. Москва: «Машиностроение», 1982. 144 с.13350.Ikhouane F., Rodellar J.
System with Hysteresis. Analysis, Identification andControl using the Bouc-Wen Model. Chichester: John Wiley & Sons, 2007.222 pp.51.Mayergoyz I. Mathematical models of hysteresis and their applications. 2nded. New York: ELSEVIER SCIENCE Inc., 2003. 472 pp.52.Красносельский М.А., Покровский А.В.
Системы с гистерезисом.Москва:Главнаяредакцияфизико-математическойлитературыиздательства «Наука», 1983. 272 с.53.Nordin M., Galic J., Gutman P.O. New models for backlash and gear play //Intarnational journal of adaptive control and signal processing, Vol. 11, 1997. pp.49-63.54.Коновалов В.И. Идентификация и диагностика систем: учебное пособиепо специальности 220201.65 «Управление и информатика в техническихсистемах».Томск:ИздательствоТомскогополитехническогоуниверситета, 2010. 155 с.55.Никульчев Е.В. Идентификация динамических систем на основесимметрий реконструированых аттракторов.
Москва: Издательство МГУП,2010. 100 с.56.Райбман Н.С. Что такое идентификация? Москва: Издательство «Наука»,1970. 118 с.57.Арцимович Г.В. Идентификация моделей гидравлики. Новосибирск:Издательство Наука Сибирское отделение, 1980. 160 с.58.СКБ ИС Каталог продукции [Электронный ресурс] // СКБ ИС Производитель датчиков перемещения (энкодеров): [сайт]. [2016]. URL:http://www.skbis.ru/index.php?p=3&c=5&d=39(датаобращения:10.Декабрь.2016).59.Ковальчук А.К., Кулаков Д.Б., Семенов С.Е. Принципы построенияпрограммногообеспечениясистемыуправленияантропоморфным134шагающим роботом // Автоматизация и современные технологии, № 2,2007. С.
10-15.60.Ebrahimirad H., Yazdanpanah M. Second International ConferenseWired/Wireless Internet Communications // Sliding Mode Congestion Control inDifferentiated Service Communication Networks. Frankfurt. 2004. pp. 101-108.61.Lazzarini V., Yi S., Ffitch J., Heintz J., Brandtsegg O., McCurdy I. Csound: ASound and Music Computing System. Springer International Publishing, 2016.515 pp.62.Аксененкова И.М., Малыгина О.А., Чекалкин Н.С., Шухов А.Г. Ряды.Интеграл Фурьеипреобразование Фурье.
Приложения. Москва:Издательство «Едиториал УРСС», 2009. 208 с.63.Рогозинский В.В., Харди Г.Г. Ряды Фурье. Москва: Издательство«ЛИБРОКОМ», 2009. 152 с.64.Привалов И.И. Ряды Фурье. Москва: Издательство «ЛИБРОКОМ», 2016.168 с.65.Радзишевский А.Ю. Основы аналогового и цифрового звука. Москва:Издательский дом «Вильямс», 2006. 288 с.66.Труханов К.А. Синтез гидропривода с дискретно управляемымдвижением выходного звена : дис. ктн : 05. 04. 13.
Москва. 2013. 165 с.67.КармановВ.Г.Математическоепрограммирование.Москва:Издательство ФИЗМАТЛИТ, 2008. 264 с.68.Жадан В.Г. Методы оптимизации: учебное пособие для студентов вузовпо направлению подготовки «Прикладные математичка и физика». Москва:МФТИ, 2014. 87 с.69.РыжиковЮ.И.Вычислительныеметоды.Санкт-Петербург:Издательство «БХВ-Петербург», 2007. 400 с.70.Метод Нелдера-Мида [Электронный ресурс] // Профессиональныйинформационно-аналитическийресурс,посвященныймашинному135обучению, распознаванию образов и интеллектуальному анализу данных.:[сайт].URL:http://www.machinelearning.ru/wiki/index.php?title=Метод_Нелдера-Мида (дата обращения: 17.Декабрь.2016).71.Квасов Б.И.
Методы изогеометрической аппроксимации сплайнами.Москва: ФИЗМАТЛИТ, 2006. 360 с.72.Щербачев П.В., Тарасов О.И., Петров А.И., Семенов С.Е., Ломакин В.О.Создание параметризованных 3D-моделей проточной части центробежныхнасосов // Наука и образование - 2012 -№4. 2012. URL: http://technomag.bmstu.ru/doc/354657.html (дата обращения: 10.11.2016).73.Щербачев П.В., Артемов А.В., Тарасов О.И. Применение B-сплайнов дляпостроения бокового полуспирального подвода насоса // Инженерныйвестник -2012-№12. 2014. URL: http://engsi.ru/doc/742584.html (датаобращения: 14.12.2016).74.Ломакин В.О. Разработка метода оптимального проектированияотводящего устройства нефтяного магистрального насоса : дисс.. канд.техн. наук: 05.04.13. Санкт-Петербург.
2012. 172 с.75.Щербачев П.В., Тарасов О.И., Рябинин М.В. Синтез оптимального законадвижениявыходногозвенаэлектрогидравлическогопривода//Справочник. Инженерный журнал, № 5, 2016. С. 49-53.76.Prautzsch H., Boehm W., Paluszny M. Bezier and B-Spline Techniques.Berlin: Springer-Verlag, 2002. 303 pp.77.Hollig K. Approximation and Modeling with B-splines. Stuttgart: Society forIndustrial and Applied Mathematics, 2013. 125 pp.78. Нейман Л.Р., Демирчян К.С., Коровкин Н.В., Чечурин В.Л. Теоретическиеосновы электротехники. Т.
1. Санкт-Петербург: Питер, 2003. 576 с.79.Новиков Ю.Н. Электротехника и электроника. Теория цепей и сигналов,методы анализа. Санкт-Петербург: Издательство «Питер», 2005. 384 с.136ПриложениеРеализация математической модели на языке с++Инициализация моделиvoid __fastcall TMyThread::init(){int i;/*//-------инициализация тестовой модели-------------dt=0.0001;ddy=0;dy=0;y=0;T=0.1;z=0.4;u=1;t=0;//-------------------------------------------------*///---------------------инициализация-----------------------//dt=0.000005;fi_0[0]=0;fi_0[1]=pi/2;fi_start=0;t=0;fi=fi_start*pi/180;dfi=0;ddfi=0;M=0;ddfi_pr=0;dfi_pr=0;137p_p=7.5e6;p_s=0.4e6;x_p[0]=0;x_p[1]=r_k;S_p=0.000921;r_k=0.02;//r_k=0.05;L_k=0.4;//L_k=100;J=1.42;M_n=0;M_tr=0;R=0.000006;delt=0.000003;k_z=0.00024;x_z_max=0.0005;dfiz=0.1;err_dfi=0;q_kr=0;T_max=1.5*2*pi/dfiz;//12.0;//9.55;Q_g=8*r_k*S_p/2/pi*dfiz;T_gu[0]=0.003;T_gu[1]=0.003;zet_gu[0]=0.4;zet_gu[1]=0.4;k_gu[0]=0.0003;k_gu[1]=0.0003;compare_p=200;compare_dfi=1600;compare_fi=200;i_compare_p=0;i_compare_dfi=0;i_compare_fi=0;;138t_pr=0;U_th[0]=0.00;U_th[1]=0.00;zazor[0]=0.0001;zazor[1]=0.0001;c_sv=10000.0/0.0001/4;k_sv=5000.0;m_p=0.5;for (i = 0; i < 2; i++){Q_n_A[i]=0;Q_s_A[i]=0;Q_n_B[i]=0;Q_s_B[i]=0;x_s_1[i]=0;x_s_2[i]=0;x_s_3[i]=0;x_s_4[i]=0;y1[i]=0;y2[i]=0;y3[i]=0;y4[i]=0;p_a[i]=5e6;p_b[i]=5e6;dp_a[i]=0;dp_b[i]=0;dx_p[i]=0;F_p[i]=0;M_p[i]=0;x_z[i]=0;dx_z[i]=0;ddx_z[i]=0;ddx_z_pr[i]=0;139U_in[i]=0;dx_z_pr[i]=0;dp_a_pr[i]=0;dp_b_pr[i]=0;fiz=0;V_A[i]=0.0002;V_B[i]=0.0002;Q_kl_n_a[i]=0;Q_kl_s_a[i]=0;Q_kl_n_b[i]=0;Q_kl_s_b[i]=0;f_kl_n_a[i]=0;f_kl_s_a[i]=0;f_kl_n_b[i]=0;f_kl_s_b[i]=0;S1[i]=0;S2[i]=0;S3[i]=0;S4[i]=0;kl_n_a[i].init();kl_s_a[i].init();kl_n_b[i].init();kl_s_b[i].init();kl_n_a[i].dt=dt;kl_s_a[i].dt=dt;kl_n_b[i].dt=dt;kl_s_b[i].dt=dt;x_z_h[i].x_max=x_z_max;x_z_h[i].d=0.02;delta[i]=0;dx_p_pr[i]=0;x_n[i]= ( L_k*( sqrt(1-r_k*r_k/L_k*L_k*sin(fi+fi_0[i])*sin(fi+fi_0[i])) - 1 ) + r_k*cos(fi+fi_0[i]) );140dx_n[i]=(dfi*(-r_k*sin(fi+fi_0[i])-0.5*r_k*r_k*sin(2*(fi+fi_0[i]))/sqrt(L_k*L_k-r_k*r_k*sin(fi+fi_0[i])*sin(fi+fi_0[i]) ) ) );x_p[i]=x_n[i];dx_p[i]=dx_n[i];F_sv[i]=0;x_l[i]=0;dx_l[i]=0;ddx_p[i]=0;ddx_p_pr[i]=0;}k_gu_n[0]=0.00034490;k_gu_n[1]=0.00079092;k_gu_p[0]=0.00085898;k_gu_p[1]=0.00026742;zazor[0]=0.00000923;zazor[1]=0.00001355;x_z_h[0].d=0*0.01341127;x_z_h[1].d=0*0.00951450;V_A[0]=0.00002724;V_A[1]=0.00002724;V_B[0]=0.00002724;V_B[1]=0.00002724;S1[0]=-0.00001773; S1[1]=-0.00001767;S2[0]=-0.00000442; S2[1]=-0.00004036;S3[0]=-0.00001523; S3[1]=-0.00000093;S4[0]=-0.00002320; S4[1]=-0.00003096;//---------------------------------------------------------//}141Класс математической модели обратного клапанаclass klapan{public:double pi, Q, k_kl, k_h, h, R, ro_fl, S1, S2, alf, ddh, g,V, ro_st, dh, ddh_pr, dt, dh_pr, m, t, h0, h_max, c, b;void init(void){pi=3.14159265;t=0;Q=0;h=0.0000;R=0;ddh=0;dh=0;ddh_pr=0;dh_pr=0;k_kl=6.354e-2;k_h=1.319e-2;ro_fl=850;S1=0.25*pi*0.0045*0.0045;S2=2.0*pi*(3.46e-3)*(0.8e-3);alf=pi/3.0;g=9.81;V=4.0/3.0*pi*pow(0.0045,3);ro_st=7800.0;m=ro_st*V;h0=0*10e-6;h_max=0.001;}double Q_klap(double p1, double p2){if (p1>=p2)142{Q=k_kl*k_h*(h+h0)*sqrt(p1-p2);}if (p1<p2){Q=-k_kl*k_h*(h+h0)*sqrt(-p1+p2);}S2=k_h*(h+h0);if (S2!=0){R=-(ro_fl*fabs(Q)*(Q/S1-Q/S2*cos(alf))p1*S1+p2*S1);}if (S2==0){R=(p1-p2)*S1;}ddh=1/m*(R+g*V*(ro_fl-ro_st));dh+=0.5*(ddh+ddh_pr)*dt;h+=0.5*(dh+dh_pr)*dt;if (h<=0){h=0;dh=0;}if (h>=h_max){h=h_max;dh=0;}143ddh_pr=ddh;dh_pr=dh;return (Q);}};Класс математической модели гистерезисаclass hysteresis_class{private:double x0, y0, add, y, slope, k;public:double d, x_max;double x_hys(double x, double dx, double dx_pr){k=0.5;if ((dx_pr<0)&&(dx>=0)){x0=x;y0=y;add=-d*x_max;}if ((dx_pr>0)&&(dx<=0)){x0=x;y0=y;add=d*x_max;}dx_pr=dx;144if((fabs(x-x0)<(2*d*x_max+2*d*x_max*k/(1-k)))&&(add<0)){slope=k*(x-x0);y=y0+slope;}else if ((fabs(x-x0)<(2*d*x_max+2*d*x_max*k/(1k)))&&(add>0)){slope=k*(x-x0);y=y0+slope;;}else{y=x+add;}return (y);}};Функция вычисления силы трения в гидроцилиндрахdouble Friction(double v, double pa, double pb){double Fbrk=500, Fc=600, f=100, kfp=2e-5, cv=100, vth=0.00001;Fc=(500+kfp*(fabs(pa-pb)+0.5*fabs(pa)+0.5*fabs(pb)));if (fabs(v)>=vth){//return ( ( Fc + (1.0*Fc-Fc)*exp(-cv*fabs(v)) ) * sign(v,0) +f*v);return ( ( Fc + (1.0*Fc-Fc)*exp(-cv*fabs(v)) ) * tanh(v*500) +f*v);}else{return (v/vth*(f*v + Fc + (1.0*Fc-Fc)*exp(-cv*fabs(vth)) ));}}145void __fastcall TMyThread::model(){int i;fiz+=dfiz*dt;Q_m=0;double k_scale=5, level=0.8;for (i = 0; i < 2; i++){k_p[i]=0.5*( 1-tanh( k_scale*(level-fabs(x_p[i]/r_k)) ) )*0.5;k_d[i]=0.5*( 1+tanh( k_scale*(level-fabs(x_p[i]/r_k)) ) )*0.5+0.5;//Вычисление рассогласования и напряжений на ЭГУ вычисляется один раз в миллисекундуif ((t-t_pr)>=0.001){delta[i]=-sin(fiz)*cos(fi)+cos(fiz)*sin(fi);//U_in[i]=(k_d[i]*0+0.5*delta[i]*sin(fi+fi_0[i])-1.0e-7*0.5*(p_a[i]-p_b[i]))*0.75;//непрерывнаякоррекцияU_in[i]=(k_d[i]*delta[i]*sin(fi+fi_0[i])-1.0e-7*k_p[i]*(p_a[i]-p_b[i]));//U_in[i]=delta[i]*sin(fi+fi_0[i]);t_pr=t;}//ЭГУ описан колебательным звеном//переменная коррекция//слежение по углу без коррекции146if (U_in[i]<0){k_gu[i]=k_gu_n[i];}else{k_gu[i]=k_gu_p[i];}if ((T_gu[i]!=0)&&(zet_gu[i]>0)&&(k_gu[i]>0)){ddx_z[i]=1.0/(T_gu[i]*T_gu[i])*(0.5*k_gu[i]*U_in[i]-2*zet_gu[i]*T_gu[i]*dx_z[i]-x_z[i]);}dx_z[i]+=0.5*(ddx_z[i]+ddx_z_pr[i])*dt;x_z[i]+=0.5*(dx_z[i]+dx_z_pr[i])*dt;x_z_hyst[i]=x_z_h[i].x_hys(x_z[i], dx_z[i], dx_z_pr[i]);ddx_z_pr[i]=ddx_z[i];dx_z_pr[i]=dx_z[i];//Ограничение смещения золотникаif (x_z_hyst[i]>x_z_max){x_z_hyst[i]=x_z_max;}if (x_z_hyst[i]<-x_z_max){x_z_hyst[i]=-x_z_max;}//Вычисление величин открытий дросселирующих щелейy1[i]=2*R-S1[i]-x_z_hyst[i];147y2[i]=2*R-S2[i]+x_z_hyst[i];y3[i]=2*R-S3[i]-x_z_hyst[i];y4[i]=2*R-S4[i]+x_z_hyst[i];x_s_1[i]=-2*R+sqrt( (2*R+delt)*(2*R+delt) + 0.25*(y1[i]+fabs(y1[i]))* (y1[i]+fabs(y1[i])) );x_s_2[i]=-2*R+sqrt( (2*R+delt)*(2*R+delt) + 0.25*(y2[i]+fabs(y2[i]))* (y2[i]+fabs(y2[i])) );x_s_3[i]=-2*R+sqrt( (2*R+delt)*(2*R+delt) + 0.25*(y3[i]+fabs(y3[i]))* (y3[i]+fabs(y3[i])) );x_s_4[i]=-2*R+sqrt( (2*R+delt)*(2*R+delt) + 0.25*(y4[i]+fabs(y4[i]))* (y4[i]+fabs(y4[i])) );//Вычисление расходов через дросселирующие щелиQ_n_A[i]=k_z*x_s_2[i]*sqrt( fabs(p_p-p_a[i]) )*sign(p_p, p_a[i]);Q_s_A[i]=k_z*x_s_1[i]*sqrt( fabs(p_a[i]-p_s) )*sign(p_a[i], p_s);Q_n_B[i]=k_z*x_s_3[i]*sqrt( fabs(p_p-p_b[i]) )*sign(p_p, p_b[i]);Q_s_B[i]=k_z*x_s_4[i]*sqrt( fabs(p_b[i]-p_s) )*sign(p_b[i], p_s);//Вычисление расходов через обратные клапаныQ_kl_n_a[i]=kl_n_a[i].Q_klap(p_a[i], p_p);Q_kl_n_b[i]=kl_n_b[i].Q_klap(p_b[i], p_p);Q_kl_s_a[i]=kl_s_a[i].Q_klap(p_s, p_a[i]);Q_kl_s_b[i]=kl_s_b[i].Q_klap(p_s, p_b[i]);//Вычисление давлений в полостях цилиндровdp_a[i]=E/(V_A[i]+x_p[i]*S_p)*(Q_n_A[i] - Q_s_A[i] - dx_p[i]*S_p - Q_kl_n_a[i] +Q_kl_s_a[i]);dp_b[i]=E/(V_B[i]-x_p[i]*S_p)*(Q_n_B[i] - Q_s_B[i] + dx_p[i]*S_p - Q_kl_n_b[i] +Q_kl_s_b[i]);p_a[i]+=0.5*(dp_a[i]+dp_a_pr[i])*dt;p_b[i]+=0.5*(dp_b[i]+dp_b_pr[i])*dt;dp_a_pr[i]=dp_a[i];dp_b_pr[i]=dp_b[i];148//Вычисление положений и скоростей ползунов, связанных жестко с валом посредством шатунов икривошиповx_n[i]= ( L_k*( sqrt(1-r_k*r_k/L_k*L_k*sin(fi+fi_0[i])*sin(fi+fi_0[i])) - 1 ) + r_k*cos(fi+fi_0[i]));dx_n[i]=(dfi*(-r_k*sin(fi+fi_0[i])-0.5*r_k*r_k*sin(2*(fi+fi_0[i]))/sqrt(L_k*L_k-r_k*r_k*sin(fi+fi_0[i])*sin(fi+fi_0[i]) ) ) );//Вычисление текущих зазоров в соединениях штоков цилиндров с ползунами с учетом упругостисвязиdx_l[i]=dx_p[i]-dx_n[i]+c_sv/k_sv*(x_p[i]-x_n[i]-x_l[i]);x_l[i]+=0.5*(dx_l[i]+dx_l_pr[i])*dt;if (x_l[i]>=zazor[i]){x_l[i]=zazor[i];dx_l[i]=0;}if (x_l[i]<=-zazor[i]){x_l[i]=-zazor[i];dx_l[i]=0;}dx_l_pr[i]=dx_l[i];//Вычисление сил, возникающих в связях штоков с ползунами с учетом люфтов и упругостейF_sv[i]=c_sv*(x_p[i]-x_n[i]-x_l[i])+k_sv*(dx_p[i]-dx_n[i]-dx_l[i]);//Вычисление сил трения в гидроцилиндрахF_tr[i]=Friction(dx_p[i], p_a[i], p_b[i]);//Вычисление ускорений, скоростей и положений поршней с учетом массы поршнейddx_p[i]=1/m_p*((p_a[i]-p_b[i])*S_p-F_tr[i]-F_sv[i]);dx_p[i]+=0.5*(ddx_p[i]+ddx_p_pr[i])*dt;x_p[i]+=0.5*(dx_p[i]+dx_p_pr[i])*dt;ddx_p_pr[i]=ddx_p[i];149dx_p_pr[i]=dx_p[i];//Вычисление моментов, вращающих коленвалM_p[i]=F_sv[i]*(-r_k*sin(fi+fi_0[i])-0.5*r_k*r_k*sin(2*(fi+fi_0[i]))r_k*r_k*sin(fi+fi_0[i])*sin(fi+fi_0[i]) ) );Q_m+=Q_n_A[i]+Q_n_B[i];}//M_n=(sin(2*pi*t)+0)*10;//M_n=125;//Вычисление ускорения, угловой скорости и положения коленвалаM=M_p[0]+M_p[1];temp=M_fric(dfi);ddfi=1/J*(M-M_n-M_fric(dfi));dfi+=0.5*(ddfi_pr+ddfi)*dt;ddfi_pr=ddfi;fi+=0.5*(dfi_pr+dfi)*dt;dfi_pr=dfi;}/sqrt(L_k*L_k-150Реализация алгоритма безусловной минимизации методом Нелдера-Мидаvoid __fastcall TMyThread::simplex(){int i, j;//---------начало минимизации L(X)------------------n_iter+=1;for (i = 0; i < n_dim+1; i++){f_sort[i]=f_t[i];}/**********сортировка значений функции в вершинах симплекса по убыванию********/for (i = 1; i < n_dim+1; i++){for (j = 0; j < n_dim-i+1; j++){if (f_sort[j]<f_sort[j+1]){f_buf=f_sort[j];f_sort[j]=f_sort[j+1];f_sort[j+1]=f_buf;}}}/******************************************************************************/fh=f_sort[0];fg=f_sort[1];fl=f_sort[n_dim];for (i = 0; i < n_dim+1; i++){if (f_t[i]==fh)151{ih=i;}if (f_t[i]==fg){ig=i;}if (f_t[i]==fl){il=i;}}/*********************************центр масс***********************************/for (j = 0; j < n_dim; j++){vc[j]=0;for (i = 0; i < n_dim+1; i++){if (i!=ih){vc[j]+=v[i][j]/n_dim;}}}/******************************************************************************//***********************************отражение**********************************/for (j = 0; j < n_dim; j++){vr[j]=(1+alf)*vc[j]-alf*v[ih][j];}fr=func(vr);152/******************************************************************************/if (fr<fl) //если значение в отраженной точке меньше минимума, то растягиваем{compr_step=false;for (j = 0; j < n_dim; j++){ve[j]=(1-gam)*vc[j]+gam*vr[j];}fe=func(ve);if (fe<fl) //если в растянутой точке значение меньше минимума, то меняем vh на ve{for (j = 0; j < n_dim; j++){v[ih][j]=ve[j];}f_t[ih]=fe;label=1;}else if (fe>fl) //иначе меняем vh на vr{for (j = 0; j < n_dim; j++){v[ih][j]=vr[j];}f_t[ih]=fr;label=2;}}else if ((fr>fl)&&(fr<fg)) //если значение в отраженной точке между fl и fg, то меняем vh на vr153{compr_step=false;for (j = 0; j < n_dim; j++){v[ih][j]=vr[j];}label=3;f_t[ih]=fr;}else if ((fr>fg)&&(fr<fh)) //если значение в отраженной точке между fg и fh, то меняем местами vr иvh, fr и fh{for (j = 0; j < n_dim; j++){v_buf[j]=v[ih][j];v[ih][j]=vr[j];vr[j]=v_buf[i];}f_buf=fh;fh=fr;fr=f_buf;compr_step=true; //нужен шаг сжатияlabel=4;}else if (fr>fh){compr_step=true;//нужен шаг сжатияlabel=5;}if (compr_step)//шаг сжатия{for (j = 0; j < n_dim; j++){vs[j]=bet*v[ih][j]+(1-bet)*vc[j];154}fs=func(vs);if (fs<fh){for (j = 0; j < n_dim; j++){v[ih][j]=vs[j];}f_t[ih]=fs;label=6;}else if (fs>fh) //сжатие к точке с минимальным значением{for (i = 0; i < n_dim+1; i++){for (j = 0; j < n_dim; j++){v[i][j]=v[il][j]+(v[i][j]-v[il][j])/2;}f_t[i]=func(v[i]);label=7;}}}/**************************критерий остановки*********************************/fsr=0;for (i = 0; i < n_dim+1; i++){//f_t[i]=func(v[i]);fsr+=f_t[i];}fsr=fsr/(n_dim+1);155//оценка по разбросу значений функцииsigma=0;for (i = 0; i < n_dim+1; i++){sigma+=fabs(f_t[i]-fsr);//((f_t[i]-fsr)*(f_t[i]-fsr));}sigma=sqrt(sigma);//---------------конец минимизации L(X)-------------}156Реализация на построения кривых при помощи сплайнов и разложение их в ряд ФурьеЗаголовочный файл//--------------------------------------------------------------------------#ifndef Unit1H#define Unit1H//--------------------------------------------------------------------------#include <Classes.hpp>#include <Controls.hpp>#include <StdCtrls.hpp>#include <Forms.hpp>#include <ExtCtrls.hpp>#include <Grids.hpp>#include <math.h>#include «Chart.hpp»#include «TeEngine.hpp»#include «TeeProcs.hpp»//--------------------------------------------------------------------------class Bspline_class{public:double point_X[100], point_Y[100],Px[100], Py[100];int p, n_P, n_points;void make_curve(void){make_knots();float t;int i, it;t=0; it=0;while (t<=(T[n_P+p])){point_X[it]=0;point_Y[it]=0;157for (i = 0; i < n_P; i++){point_X[it]+=Px[i]*basis(i, p, t, T);point_Y[it]+=Py[i]*basis(i, p, t, T);}it++;t+=T[n_P+p]/(float)(n_points);}point_X[n_points-1]=Px[n_P-1];point_Y[n_points-1]=Py[n_P-1];}private:double T[50];void make_knots(){int i;for (i = 0; i <=(p+n_P); i++){if (i<=p){T[i]=0;}else if (i>n_P){T[i]=T[i-1];}else{T[i]=T[i-1]+1;}}}double basis(int i, int p, float t, double T[50]){158double res;int j;for (j = 0; j <= p; j++){if (j==0){if ( (t>=T[i])&&(t<T[i+1]) ){res=1;}else{res=0;}}else if ( ((T[i+j]-T[i])!=0)&&((T[i+j+1]-T[i+1])!=0) ){res=(t-T[i])/(T[i+j]-T[i])*basis(i,j-1,t,T)+(T[i+j+1]-t)/(T[i+j+1]-T[i+1])*basis(i+1, j-1, t, T);}else if ( ((T[i+j]-T[i])==0)&&((T[i+j+1]-T[i+1])!=0) ){res=(T[i+j+1]-t)/(T[i+j+1]-T[i+1])*basis(i+1,j-1, t, T);}else if ( ((T[i+j]-T[i])!=0)&&((T[i+j+1]-T[i+1])==0) ){res=(t-T[i])/(T[i+j]-T[i])*basis(i, j-1, t, T);}}return res;}159};Bspline_class spl;const double pi=3.14159;double T, A, sc_x, sc_y, disp_x, disp_y, a, b, c, d, reg_X[1000], reg_Y[1000],af[100], bf[100], fourier[1000], t[1000], dx;int ng;void draw_curve(int N, double X[50], double Y[50], double scale_X, double scale_Y, doubledisp_X, double disp_Y, AnsiString clr, int w);void draw_points(int N, double X[50], double Y[50], double scale_X, double scale_Y, doubledisp_X, double disp_Y, AnsiString clr, int w);void reg(int N_in, int N_out, double X[50], double Y[50]);void fourier_series(int Ng);void draw_axes(double scale_X, double scale_Y, double disp_X, double disp_Y);class TForm1 : public TForm{__published: // IDE-managed ComponentsTImage *Image1;TLabel *Label1;TScrollBar *ScrollBar1;TLabel *Label2;TScrollBar *ScrollBar2;TLabel *Label3;TScrollBar *ScrollBar3;TLabel *Label4;TScrollBar *ScrollBar4;TStringGrid *StringGrid1;TEdit *Edit1;TLabel *Label5;TButton *Button1;TLabel *Label6;160TLabel *Label7;TLabel *Label8;TLabel *Label9;TLabel *Label10;TLabel *Label11;TLabel *Label12;void __fastcall ScrollBarChange(TObject *Sender);void __fastcall Button1Click(TObject *Sender);void __fastcall Edit1Change(TObject *Sender);private:// User declarationspublic:// User declarations__fastcall TForm1(TComponent* Owner);};//--------------------------------------------------------------------------extern PACKAGE TForm1 *Form1;//--------------------------------------------------------------------------#endifОсновной модуль программы//--------------------------------------------------------------------------#include <vcl.h>#pragma hdrstop#include «Unit1.h»//--------------------------------------------------------------------------#pragma package(smart_init)#pragma link «Chart»#pragma link «TeEngine»#pragma link «TeeProcs»#pragma resource «*.dfm»TForm1 *Form1;161void draw_curve(int N, double X[1000], double Y[1000], double scale_X, double scale_Y, doubledisp_X, double disp_Y, AnsiString clr, int w){int i;Form1->Image1->Canvas->MoveTo( (int)(X[0]*scale_X+disp_X), (int)(Y[0]*scale_Y+disp_Y));if (clr==«red»){Form1->Image1->Canvas->Pen->Color=clRed;}if (clr==«green»){Form1->Image1->Canvas->Pen->Color=clGreen;}if (clr==«blue»){Form1->Image1->Canvas->Pen->Color=clBlue;}if (clr==«black»){Form1->Image1->Canvas->Pen->Color=clBlack;}Form1->Image1->Canvas->Pen->Width=w;for (i = 1; i < N; i++){Form1->Image1->Canvas->LineTo((int)(X[i]*scale_X+disp_X), (int)(-Y[i]*scale_Y+disp_Y));}}void draw_points(int N, double X[100], double Y[100], double scale_X, double scale_Y, doubledisp_X, double disp_Y, AnsiString clr, int w){162int i, R=5;if (clr==«red»){Form1->Image1->Canvas->Pen->Color=clRed;}if (clr==«green»){Form1->Image1->Canvas->Pen->Color=clGreen;}if (clr==«blue»){Form1->Image1->Canvas->Pen->Color=clBlue;}if (clr==«black»){Form1->Image1->Canvas->Pen->Color=clBlack;}Form1->Image1->Canvas->Pen->Width=w;for (i = 0; i < N; i++){Form1->Image1->Canvas->Ellipse((int)(X[i]*scale_X+disp_X)+R,Y[i]*scale_Y+disp_Y)+R, (int)(X[i]*scale_X+disp_X)-R, (int)(-Y[i]*scale_Y+disp_Y)-R);}}void reg(int N_in, int N_out, double X[50], double Y[50]){double x;int i, j;dx=(X[N_in-1]-X[0])/(N_out-1);(int)(-163j=1;reg_X[0]=X[0];reg_Y[0]=Y[0];reg_X[N_out]=X[N_in-1];reg_Y[N_out]=-Y[N_in-1];for (i = 1; i < N_out; i++){reg_X[i]=reg_X[i-1]+dx;reg_X[i+N_out]=reg_X[i]+X[N_in-1];while (j<N_in){if ((reg_X[i]>=X[j-1])&&(reg_X[i]<X[j])){break;}else{j++;}}reg_Y[i]=reg_Y[i-1]+(Y[j]-Y[j-1])/(X[j]-X[j-1])*dx;reg_Y[i+N_out]=-reg_Y[i];}}void fourier_series(int Ng){int k, i;for (k = 1; k <= Ng; k++){af[k]=0;164bf[k]=0;for (i = 0; i < 1000; i++){af[k]+=2/T*reg_Y[i]*cos(k*2*pi/T*reg_X[i])*dx;bf[k]+=2/T*reg_Y[i]*sin(k*2*pi/T*reg_X[i])*dx;}}for (i = 0; i < 1000; i++){fourier[i]=0;t[i]=reg_X[i];for (k = 1; k <= Ng; k++){fourier[i]+=af[k]*cos(k*2*pi/T*t[i])+bf[k]*sin(k*2*pi/T*t[i]);}}}void draw_axes(double scale_X, double scale_Y, double disp_X, double disp_Y){Form1->Image1->Canvas->Pen->Color=clBlack;Form1->Image1->Canvas->Pen->Width=2;Form1->Image1->Canvas->MoveTo((int)(disp_X)-10, (int)(disp_Y));Form1->Image1->Canvas->LineTo((int)(disp_X+T*scale_X)+20, (int)(disp_Y));Form1->Image1->Canvas->LineTo((int)(disp_X+T*scale_X)+5, (int)(disp_Y)+5);Form1->Image1->Canvas->MoveTo((int)(disp_X+T*scale_X)+20, (int)(disp_Y));Form1->Image1->Canvas->LineTo((int)(disp_X+T*scale_X)+5, (int)(disp_Y)-5);Form1->Image1->Canvas->MoveTo((int)(disp_X), (int)(disp_Y+A*scale_Y)+30);Form1->Image1->Canvas->LineTo((int)(disp_X), (int)(disp_Y-A*scale_Y)-30);Form1->Image1->Canvas->LineTo((int)(disp_X)+5, (int)(disp_Y-A*scale_Y)-15);Form1->Image1->Canvas->MoveTo((int)(disp_X), (int)(disp_Y-A*scale_Y)-30);Form1->Image1->Canvas->LineTo((int)(disp_X)-5, (int)(disp_Y-A*scale_Y)-15);Form1->Image1->Canvas->Pen->Width=1;Form1->Image1->Canvas->MoveTo((int)(disp_X), (int)(disp_Y-A*scale_Y));165Form1->Image1->Canvas->LineTo((int)(disp_X+T*scale_X), (int)(disp_Y-A*scale_Y));Form1->Image1->Canvas->LineTo((int)(disp_X+T*scale_X), (int)(disp_Y+A*scale_Y));Form1->Image1->Canvas->LineTo((int)(disp_X), (int)(disp_Y+A*scale_Y));Form1->Image1->Canvas->MoveTo((int)(disp_X+0.5*T*scale_X), (int)(disp_Y+A*scale_Y));Form1->Image1->Canvas->LineTo((int)(disp_X+0.5*T*scale_X), (int)(disp_Y-A*scale_Y));Form1->Image1->Canvas->MoveTo((int)(disp_X+0.25*T*scale_X), (int)(disp_Y-A*scale_Y));Form1->Image1->Canvas->LineTo((int)(disp_X+0.25*T*scale_X), (int)(disp_Y+A*scale_Y));Form1->Image1->Canvas->MoveTo((int)(disp_X+0.75*T*scale_X), (int)(disp_Y+A*scale_Y));Form1->Image1->Canvas->LineTo((int)(disp_X+0.75*T*scale_X), (int)(disp_Y-A*scale_Y));Form1->Label6->Left=Form1->Image1->Left+(int)(disp_X+T*scale_X)+30;Form1->Label6->Top=Form1->Image1->Top+(int)(disp_Y);Form1->Label7->Left=Form1->Image1->Left+(int)(disp_X)-30;Form1->Label7->Top=Form1->Image1->Top+(int)(disp_Y-A*scale_Y)-40;Form1->Label8->Left=Form1->Image1->Left+(int)(disp_X+T*scale_X)+5;Form1->Label8->Top=Form1->Image1->Top+(int)(disp_Y)+5;Form1->Label9->Left=Form1->Image1->Left+(int)(disp_X+0.5*T*scale_X)+5;Form1->Label9->Top=Form1->Image1->Top+(int)(disp_Y)+5;Form1->Label10->Left=Form1->Image1->Left+(int)(disp_X+0.25*T*scale_X)+5;Form1->Label10->Top=Form1->Image1->Top+(int)(disp_Y)+5;Form1->Label11->Left=Form1->Image1->Left+(int)(disp_X+0.75*T*scale_X)+5;Form1->Label11->Top=Form1->Image1->Top+(int)(disp_Y)+5;}//--------------------------------------------------------------------------__fastcall TForm1::TForm1(TComponent* Owner): TForm(Owner){spl.n_P=7;spl.n_points=100;spl.p=2;T=1.0;A=1.0;a=0.05;b=0.05;166c=0.1;d=0.5;disp_x=50.0;disp_y=300.0;sc_x=400.0;sc_y=200.0;ng=StrToInt(Form1->Edit1->Text);spl.Px[0]=0;spl.Px[1]=0.5*a*T;spl.Py[0]=0;spl.Py[1]=c*A;spl.Px[2]=0.5*b*T;spl.Py[2]=d*A;spl.Px[3]=0.25*T;spl.Py[3]=A;spl.Px[4]=0.5*(1.0-b)*T;spl.Py[4]=d*A;spl.Px[5]=0.5*(1.0-a)*T;spl.Py[5]=c*A;spl.Px[6]=0.5*T;spl.Py[6]=0;spl.make_curve();/*for (int j=0; j < spl.n_P; j++){Form1->StringGrid1->Cells[0][j+1]=j;Form1->StringGrid1->Cells[1][j+1]=FloatToStrF(spl.point_X[j], ffFixed, 5, 3);Form1->StringGrid1->Cells[2][j+1]=FloatToStrF(spl.Py[j], ffFixed, 5, 3);}*/reg (spl.n_points, 500, spl.point_X, spl.point_Y);draw_axes(sc_x, sc_y, disp_x, disp_y);draw_points(spl.n_P, spl.Px, spl.Py, sc_x, sc_y, disp_x, disp_y, «black», 2);draw_curve(spl.n_P, spl.Px, spl.Py, sc_x, sc_y, disp_x, disp_y, «black», 1);167//draw_curve(spl.n_points, spl.point_X, spl.point_Y, sc_x, sc_y, disp_x, disp_y, «red», 3);draw_curve(1000, reg_X, reg_Y, sc_x, sc_y, disp_x, disp_y, «red», 3);}//--------------------------------------------------------------------------void __fastcall TForm1::ScrollBarChange(TObject *Sender){if (Sender==ScrollBar1){a=Form1->ScrollBar1->Position/100.0;Form1->Label1->Caption=«a=«+FloatToStrF(a, ffFixed, 2, 2);}if (Sender==ScrollBar2){b=Form1->ScrollBar2->Position/100.0;Form1->Label2->Caption=«b=«+FloatToStrF(b, ffFixed, 2, 2);}if (Sender==ScrollBar3){c=Form1->ScrollBar3->Position/100.0;Form1->Label3->Caption=«c=«+FloatToStrF(c, ffFixed, 2, 2);}if (Sender==ScrollBar4){d=Form1->ScrollBar4->Position/100.0;Form1->Label4->Caption=«d=«+FloatToStrF(d, ffFixed, 2, 2);}spl.Px[0]=0;spl.Px[1]=0.5*a*T;spl.Py[0]=0;spl.Py[1]=c*A;spl.Px[2]=0.5*b*T;spl.Py[2]=d*A;spl.Px[3]=0.25*T;spl.Py[3]=A;spl.Px[4]=0.5*(1.0-b)*T;spl.Py[4]=d*A;spl.Px[5]=0.5*(1.0-a)*T;spl.Py[5]=c*A;168spl.Px[6]=0.5*T;spl.Py[6]=0;spl.make_curve();Image1->Canvas->FillRect(Rect(0,0,Image1->Width,Image1->Height));draw_axes(sc_x, sc_y, disp_x, disp_y);draw_points(spl.n_P, spl.Px, spl.Py, sc_x, sc_y, disp_x, disp_y, «black», 2);draw_curve(spl.n_P, spl.Px, spl.Py, sc_x, sc_y, disp_x, disp_y, «black», 1);//draw_curve(spl.n_points, spl.point_X, spl.point_Y, sc_x, sc_y, disp_x, disp_y, «red», 3);reg (spl.n_points, 500, spl.point_X, spl.point_Y);draw_curve(1000, reg_X, reg_Y, sc_x, sc_y, disp_x, disp_y, «red», 3);/*for (int j=0; j < spl.n_P; j++){Form1->StringGrid1->Cells[0][j+1]=j;Form1->StringGrid1->Cells[1][j+1]=FloatToStrF(spl.Px[j], ffFixed, 5, 3);Form1->StringGrid1->Cells[2][j+1]=FloatToStrF(spl.Py[j], ffFixed, 5, 3);}*/}//--------------------------------------------------------------------------void __fastcall TForm1::Button1Click(TObject *Sender){fourier_series(ng);Image1->Canvas->FillRect(Rect(0,0,Image1->Width,Image1->Height));draw_axes(sc_x, sc_y, disp_x, disp_y);draw_points(spl.n_P, spl.Px, spl.Py, sc_x, sc_y, disp_x, disp_y, «black», 2);draw_curve(spl.n_P, spl.Px, spl.Py, sc_x, sc_y, disp_x, disp_y, «black», 1);//draw_curve(spl.n_points, spl.point_X, spl.point_Y, sc_x, sc_y, disp_x, disp_y, «red», 3);169draw_curve(1000, reg_X, reg_Y, sc_x, sc_y, disp_x, disp_y, «red», 3);draw_curve(1000, t, fourier, sc_x, sc_y, disp_x, disp_y, «blue», 3);Form1->StringGrid1->RowCount=ng+1;for (int i = 1; i <= ng; i++){Form1->StringGrid1->Cells[0][i]=i;Form1->StringGrid1->Cells[1][i]=FloatToStrF(af[i], ffFixed, 5, 3);Form1->StringGrid1->Cells[2][i]=FloatToStrF(bf[i], ffFixed, 5, 3);}Form1->StringGrid1->Cells[0][0]=«Номер»;Form1->StringGrid1->Cells[1][0]=«A»;Form1->StringGrid1->Cells[2][0]=«B»;}//--------------------------------------------------------------------------void __fastcall TForm1::Edit1Change(TObject *Sender){ng=StrToInt(Form1->Edit1->Text);}//---------------------------------------------------------------------------.