Le fichier de données et celui de fonctions communes sont identiques à ceux de File:Repression pic gaussien dissymetrique bruite.svg.
// ********** // Константы и инициализация // **********ясно ; клф ;чдир ( 'monchemin/' )// Параметры точности Ньютона-Рафсона = 1e-7 ; // условие остановки itermax = 60 ; // то же // Точность приближения линеаризации epsilon = 1e-6 ; // ********** // Функции // ********** exec ( 'fonctions_communes.sce' , - 1 ) function [e] = res ( Yexp, Ycal ) e = sqrt ( сумма (( Yexp - Ycal ). ^ 2 )); конечная функция function [A, R] = gaussnewton ( f, X, Yexp, A0, imax, epsilon ) // A : оптимизированные параметры регрессии (вектор) // R : список факторов качества регрессии // для chaque étape (vecteur) // X : поясняющая переменная (vector) // Yexp : переменная expliquée, valeurs mesurées (vector) // A0 : параметры инициализации модели (vector) // epsilon : valeur d'arrêt (scalaire) k = 1 ; // начальный коэффициент амортизации, <=1, // предотвращаем расхождение n = size ( X , '*' ); e0 = sqrt ( сумма ( Yexp .^ 2 )); // нормализация фактора качества Ycal = f ( A0 , X ); // начальная модель R ( 1 ) = res ( Yexp , Ycal ) / e0 ; // факт качества начального disp ( 'i = 1 ; k = 1 ; R = ' + string ( R ( 1 ))) // начальный параметр affichage i = 1 ; В = А0 ; подзаголовок ( 2 , 1 , 1 ) plot2d ( X , Yexp , rect =[ - 3 , - 2 , 3 , 12 ]) plot ( X , Ycal , "-r" ) xstring ( -2.8 , -1.5 , string ( B ) ) subplot ( 2 , 1 , 2 ) plot2d ( R , rect =[ 1 , 0 , 10 , 1 ]) xstring ( 1.2 , 0.1 , 'α = ' + string ( k ) + '; R = ' + string ( R ( i ))) nom = 'picassym' + string ( i ) + '.gif' ; xs2gif ( 0 , nom ) drapeau = %t ; while ( i < imax ) & drapeau // тест глобальной сходимости i = i + 1 ; deltay = Yexp - Ycal ; J = linearisation_approchee ( f , B , X , epsilon ) ; // матрица Якобьена tJ = J ' ; // транспонированное deltap0 = inv (( tJ * J )) * tJ * deltay ; drapeau2 = %t // для 1-го выполнения while drapeau2 & ( k > 0.1 ) // проверка расхождения на 1 этапе deltap = k * deltap0 ; Бнуво = B + дельтап ' ; Ycal = f ( Бнуво , X ); р ( я ) знак равно рез ( Yexp , Ycal ) / e0 ; драпировка2 = ( R ( i ) > = R ( i - 1 )) // vrai si расходятся if drapeau2 then k = k * 0,75 ; // ослабление si расходится else k0 = k ; // для affichage de la valeur k = ( 1 + k ) / 2 ; // уменьшить ослабление, если оно сходится end end B = Bnouveau ; драпировка = абс ( р ( я - 1 ) - р ( я )) > эпсилон clf ; подучасток ( 2 , 1 , 1 ) plot2d ( X , Yexp , rect = [ - 3 , -2 , 3 , 12 ]) участок ( X , Ycal , " -r " ) xstring ( -2.8 , -1.5 , строка ( B )) подучасток ( 2 , 1 , 2 ) участок2d ( R , прямоугольник = [ 1 , 0 , 10 , 1 ]) xстрока ( 1.2 , 0.1 , 'α = ' + строка ( k0 ) + ' ; R = ' + строка ( R ( i ))) имя = 'picassym' + строка ( i ) + '.gif' ; xs2gif ( 0 , nom ) // disp('i = '+string(i)+' ; k = '+string(k0)+' ; R = '+string(R(i))) end A = B ; конечная функция // ********** // Руководитель программы // ********** // лекция донне donnees = read ( 'pic_gauss_dissym_bruite.txt' , - 1 , 2 ); // автомобильные перевозки Xdef = donnees (:, 1 ); Ydef = Донни (:, 2 ); // Ainit = [-0,03, 9,7, 8*((0,84 - 0,03)/2,35)^2, 8*((0,45 + 0,03)/2,35)^2]; Айнит = [ 1 , 1 , 1 , 1 ]; // Регрессионный тик (); [ Aopt , Rnr ] =... gaussnewton ( gauss_dissym , Xdef , Ydef ,... Ainit , itermax , точность ) t = toc (); // Расчет курса Yopt = gauss_dissym ( Aopt , Xdef ); // Affichage print ( %io ( 2 ), Ainit ) print ( %io ( 2 ), Aopt ) print ( %io ( 2 ), t ) clf subplot ( 2 , 1 , 1 ) plot ( Xdef , Ydef , "- b" ) график ( Xdef , Yopt , "-r" ) подзаголовок ( 2 , 1 , 2 ) график ( Rnr )