Găsirea unei funcții obiectiv prestabilit minim
Datorită faptului că metoda de ordinul zero de coborâre, este destul de precisă. Datorită faptului că funcția Rosenbrock are de relief viroaga pentru a atinge punctul minim nu a reușit. punct de oprire în acest caz a fost destul de departe de punctul minim. În cazul punctului de minim funcția elipsă a fost realizată în 21 de iterație, în etapa h = 0,2. In ciuda acestui punct minim funcție obiectiv predeterminat a fost atins exact 91 per repetare, cu pasul h = 0,2 și o precizie de 0,0001.
bibliografie
Fișierul principal al proiectului.
4. ITERATION_AMOUNT = 1000;
5. EPSILON = 0,001; % Precizie
7. POINT_AMOUNT = 50; % Numărul de puncte
punct de pornire 9%
11. x_point_Ellipse (1) = 2;
12. x_point_Ellipse (2) = -2;
14. x_point_Rosenbrock (1) = 4;
15. x_point_Rosenbrock (2) = 3;
17. a1_T_point_CF (1) = 2;
18. a1_T_point_CF (2) = 4;
20.% a și b - valorile pentru raze f II. Elipsă.
24% setările inițiale funcția W (s).
28. ELLIPSE = 'ELLIPSE';
29. ROSENBROCK = 'ROSENBROCK';
32. Partea 1% Euler.
33. y_teor = FirstPart_EulerMethod (a1, T, POINT_AMOUNT);
35% Partea a 2 coordinatewise de optimizare.
36.% funcția [value_of_funct, x] = SecondPart_OptimizationCoordinate (function_name, h, EPSILON, ITERATION_AMOUNT, a, b, y_exp, number_y_exp, POINT_AMOUNT)
37. [y_Ellipse, x_Ellipse] = SecondPart_OptimizationCoordinate (ELLIPSE, h, EPSILON, ITERATION_AMOUNT, x_point_Ellipse, a, b, -1, -1, POINT_AMOUNT);
38. [y_Rosenbrock, x_Rosenbrock] = SecondPart_OptimizationCoordinate (ROSENBROCK, h, EPSILON, ITERATION_AMOUNT, x_point_Rosenbrock, a, b, -1, -1, POINT_AMOUNT);
40% 3. Partea RNG. CF
41. [CF, a1_T_1, a1_T_2, a1_T_3] = ThirdPart (CF_text, h, EPSILON, ITERATION_AMOUNT, a1_T_point_CF, a, b, y_teor, POINT_AMOUNT);
Funcția metodei Euler.
1. Funcția y_Euler_50point = FirstPart_EulerMethod (a1, T, POINT_AMOUNT)
3. y_Euler la nivel mondial;
5. ITERATION_AMOUNT = 300; % Numărul de puncte pentru primul program.
6. x_t = 5; % Din x referință constantă (t)
11. coeff_z1 = 120 * a1 / T. ^ 2 + 6;
12. coeff_z2 = 6 * a1-120 + 48 * a1 / T;
13. coeff_x_t = 120 * a1 / T. ^ 2;
14.% free_term - termen liber.
15. free_term = coeff_x_t * x_t;
17. pentru i = 1: ITERATION_AMOUNT
18. z1 (i + 1) = z1 (i) + h * z2 (i);
19. z2 (i + 1) = z2 (i) + h * (x_t-z1 (i) -0.4 * T * z2 (i)) / T. ^ 2;
20. y_Euler (i) = coeff_z1 * z1 (i) + coeff_z2 * z2 (i) - free_term;
24.% i = 1: ITERATION_AMOUNT;
26.% titlu (“Y grafic teoretic puncte 300' .);
28.% saveas (GCF, 'ieșire', 'bmp');
29% din rezerva de 300 de puncte numai 50 (POINT_AMOUNT)
31. step_cycle = ITERATION_AMOUNT / POINT_AMOUNT;
32. pentru i = 1: step_cycle: ITERATION_AMOUNT
33. y_Euler_50point (j) = y_Euler (i);
38.% i = 1: POINT_AMOUNT;
titlu 40.% ( 'Y graficul teoretic 50 puncte (fiecare 6).');
Funcția de optimizare coordinatewise
1. Partea 2% coordinatewise de optimizare.
2. Funcția [value_of_funct, x] = SecondPart_OptimizationCoordinate (function_name, h, EPSILON, ITERATION_AMOUNT, x_start_point, a, b, y_exp, number_y_exp, POINT_AMOUNT)
8. clar (varlist);
14. Deplasare%. pentru a sări peste condițiile de testare out prev. min value_of_funct din ultimele trei sau nu.
15. change_coord = 1;
16% pentru a ieși din bucla dacă numărul. Mai multe iterații ITERATION_AMOUNT.
17. number_iteration = 1;
23. x (1,1) = x_start_point (1); % Prima coordonată, prima valoare.
24. x (2,1) = x_start_point (2); În al doilea rând% coordonate, prima valoare.
25. x (1,2) = x (modificare, i-1) + h; % Prima coordonată, a doua valoare.
26. x (2,2) = x (constant, i-1); % A doua coordonate, a doua valoare.
28. value_of_funct (1) = Ellipse_Rosenbrock_or_CF (function_name, x (1,1), x (2,1), a, b, y_exp, number_y_exp, POINT_AMOUNT);
29. new_value_of_function = Ellipse_Rosenbrock_or_CF (function_name, x (1,2), x (2,2), a, b, y_exp, number_y_exp, POINT_AMOUNT);
31. dacă new_value_of_function> value_of_funct (1)
33. x (1,2) = x (modificare, i-1) + h;
34. value_of_funct (2) = Ellipse_Rosenbrock_or_CF (function_name, x (schimbare, i), x (constant, i), a, b, y_exp, number_y_exp, POINT_AMOUNT);
37. value_of_funct (2) = new_value_of_function;
40% ciclu până când modulul diferenței funcționează mai epsilon precizie și numărul de iterații este mai mică decât ITERATION_AMOUNT (10000).
41. în timp ce (abs (value_of_funct (i) -value_of_funct (i-1))> EPSILON (number_iteration
43. number_iteration = number_iteration + 1;
45. change_coord = change_coord + 1;
47% se adaugă la prima etapă de coordonate.
48. x (schimbare, i) = x (modificare, i-1) + h;
49% coordonate a doua rescriere.
50. x (constante, i) = x (constant, i-1);
51% găsi valoarea funcției a noilor valori.
52. new_value_of_function = Ellipse_Rosenbrock_or_CF (function_name, x (1, i), x (2, i), a, b, y_exp, number_y_exp, POINT_AMOUNT);
54% în cazul în care funcția valorile curente mai mult decât o funcție a, atunci h = h * (-1) anterior. în caz contrar value_of_funct (i) = new_value_of_function.
55. dacă new_value_of_function> value_of_funct (i-1)
57% zero afară de ultima valoare
58. x (schimbare, i) = NaN;
59. i = i - 1; % Pentru a reveni la funcția de valoare minimă anterioară
% 62. În cazul în care poziția de deplasare ritm făcut nu mai puțin de 3 puncte, apoi prin efectuarea min value_of_funct a ultimilor 3. valori.
63. if (change_coord> = 3)
65% în cazul în care funcția valorilor din etapa anterioară este mai puțin curent și mai puțin în etapa i-2, apoi modificați mișcarea de coordonate.
66. dacă value_of_funct (i-1)> = value_of_funct (i)
68. După% Schimbare coordonate ritm propriu - change_coord zeroize.
69. change_coord = 0;
70. dacă (== constantă 1)
16. value_of_funct = suma ((y_exp (number_y_exp, :) - y_model) ^ 2) / POINT_AMOUNT ;.
20. value_of_funct = -1;
- Partea 3.% CF
- Funcția [CF, a1_T_1, a1_T_2, a1_T_3] = ThirdPart (function_name, h, EPSILON, ITERATION_AMOUNT, a1_T_point_CF, a, b, y_teor, POINT_AMOUNT)
- % Y_max iau de la 1 parte.
- y_max = max (abs (y_teor));
- .elta_y = y max * Mu
- delta_y (1) = y_max * 0,005;
- delta_y (2) = y_max * 0,01;
- delta_y (3) = y_max * 0,02;
- % Generatorul de numere aleatorii. zgomot triunghiulara.
- [Y_noise (1), X_noise (1)] = RNG_Triangle (delta_y (1), POINT_AMOUNT);
- [Y_noise (2), X_noise (2)] = RNG_Triangle (delta_y (2), POINT_AMOUNT);
- [Y_noise (3), X_noise (3)] = RNG_Triangle (delta_y (3), POINT_AMOUNT);
- y_exp (1.) = y_teor + x_noise (1);
- y_exp (2) = y_teor + x_noise (2).
- y_exp (3) = y_teor + x_noise (3).
- i = 1: POINT_AMOUNT;
- s_exp1 = 'k';
- s_exp2 = 'g';
- s_exp3 = 'b';
- s_teor = 'r';
- % Y reprezentate experimental.
- % Figura;
- % Plot (y_exp (1), s_exp1.);
- Titlu% ( 'Yexp1 - Negru');
- % Figura;
- % Plot (y_exp (2), s_exp2.);
- Titlu% ( 'Yexp2 - verde');
- % Figura;
- % Plot (i, y_exp (3), s_exp3, i, y_teor, s_teor.);
- Titlu% ( 'Yexp3 - albastru Yteor - rosu.');
- number_y_exp_1 = 1;
- number_y_exp_2 = 2;
- number_y_exp_3 = 3;
- [CF1, a1_T_1] = SecondPart_OptimizationCoordinate (function_name, h, EPSILON, ITERATION_AMOUNT, a1_T_point_CF, a, b, y_exp, number_y_exp_1, POINT_AMOUNT);
- [CF2, a1_T_2] = SecondPart_OptimizationCoordinate (function_name, h, EPSILON, ITERATION_AMOUNT, a1_T_point_CF, a, b, y_exp, number_y_exp_2, POINT_AMOUNT);
- [CF3, a1_T_3] = SecondPart_OptimizationCoordinate (function_name, h, EPSILON, ITERATION_AMOUNT, a1_T_point_CF, a, b, y_exp, number_y_exp_3, POINT_AMOUNT);
- Aruncări matrice% CF1, CF2, CF3 într-o matrice bidimensională a CF (3 :).
- size_CF (1) = dimensiunea (CF1, 2);
- size_CF (2) = dimensiunea (CF2, 2);
- size_CF (3) = dimensiunea (CF3, 2);
- pentru i = 1: size_CF (1)
- CF (1, i) = CF1 (i);
- capăt
- pentru i = 1: size_CF (2)
- CF (2, i) = CF2 (i);
- capăt
- pentru i = 1: size_CF (3)
- CF (3, i) = CF3 (i);
- capăt
- capăt
- Partea a 3%.
- % Generatorul de numere aleatorii. pe Delta y_noise.
- % Generatorul de numere aleatorii. zgomot triunghiulara.
- Funcția [y_noise, x_noise] = RNG_Triangle (delta_y, POINT_AMOUNT)
- j = 1;
- în timp ce j <= POINT_AMOUNT
- % A - o linie dreaptă orizontală - argumentul. Noi genera un număr de -delta_y la delta_y.
- . A = -delta_y + (delta_y - (- delta_y)) * rand ();
- % B - pe linia verticală - funcția. Noi genera un număr cuprins între 0 și 1 / delta_y.
- . B = 0 + (1 / delta_y-0) * rand ();
- % Fprintf ( 'Value_of_Function (a, delta_y) = \ n.', Value_of_Function (a, delta_y));
- % În cazul în care b este mai mică, atunci a generat un punct în interiorul unui triunghi.
- dacă RNG_Value_of_Function (a, delta_y)> b
- y_noise (j) = b;
- x_noise (j) = a;
- j = j + 1;
- se încheie;
- se încheie;
- % Figura;
- % Desenați o histogramă.
- % Hist (x_noise);
- capăt
- Partea a 3%.
- % Calculul funcției RNG pentru oricare argument „+“ sau „-“.
- Funcția y_triangle = RNG_Value_of_Function (argument, delta_y)
- x1 = 0;
- y1 = 1 / delta_y;
- y2 = 0;
- % Valoarea orizontală (argument) este mai mare sau mai mică decât zero
- dacă argumentul> 0
- x2 = delta_y;
- altfel
- x2 = -delta_y;
- se încheie;
- y_triangle = (argument - x1) * (y2 - y1) / (x2 - x1) + y1;
- % Fprintf ( 'y_triangle = \ n.', Y_triangle);
- capăt
- %, Curbele de nivel și programul de căutare min.
- Funcția draw_way_and_lines_level (function_name, x, LAST_NUMBER, value_of_funct, number_iteration, a, b, y_exp, number_y_exp, POINT_AMOUNT)
- dacă strcmp (function_name, 'ELLIPSE') == 1
- title_plot = ( 'Funcția Elipsa');
- x_contour = -5: 0,1: 5;
- y_contour = -5: 0,1: 5;
- [X, Y] = meshgrid (x_contour, y_contour);
- . Z = (X / a) ^ 2 + (Y / b) ^ 2 .;
- % Punct MIN
- min_x = 0;
- min_y = 0;
- contour_amount = 50;
- % Coordonate placă de ieșire de date
- text_x = -4.8;
- text_y = -3.9;
- elseif strcmp (function_name, 'ROSENBROCK') == 1
- title_plot = ( 'Funcția Rosenbroke');
- x_contour = -5: 0,1: 5;
- y_contour = -5: 0,1: 5;
- [X, Y] = meshgrid (x_contour, y_contour);
- Z = 100 * (Y - X ^ 2) ^ 2 + (1 - X) ^ 2.;.
- % Punct MIN
- min_x = 1;
- min_y = 1;
- contour_amount = 200;
- % Coordonate placă de ieșire de date
- text_x = -4.8;
- text_y = -3.9;
- elseif strcmp (function_name CF ') == 1
- % Title_plot = ( 'CF (funcția obiectiv)');
- title_plot = strcat ( 'CF', num2str (number_y_exp), '(funcția obiectiv)');
- a1_start = -2;
- a1_step = 0,2;
- a1_end = 13;
- a1_contour = a1_start: a1_step: a1_end;
- T_start = 1,8;
- T_step = a1_step;
- T_end = 7,8;
- T_contour = T_start: T_step: T_end;
- % Crearea unei matrice de valori ale parametrilor necunoscuți pentru construcția liniilor de nivel.
- [A1_plot, T_plot] = meshgrid (a1_contour, T_contour);
- iter_amount_a1 = (a1_end - a1_start) / a1_step + 1;
- iter_amount_T = (T_end - T_start) / T_step + 1;
- % Fprintf ( 'iter_amount_a1 = \ n.', Iter_amount_a1);
- % Fprintf ( 'iter_amount_T = \ n.', Iter_amount_T);
- % Aici se creează o matrice de valori CF pentru a construi liniile de nivel.
- pentru i = 1: iter_amount_T
- pentru j = 1: iter_amount_a1
- y_model = FirstPart_EulerMethod (a1_plot (i, j), T_plot (i, j), POINT_AMOUNT);
- Z (i, j) = suma ((y_exp (number_y_exp) -y_model) ^ 2 ..) / POINT_AMOUNT;
- capăt
- capăt
- X = a1_plot;
- Y = T_plot;
- min_x = 10;
- min_y = 2;
- contour_amount = 500;
- text_x = -1.7;
- text_y = 2,5;
- capăt
- % cifra
- % Mesh (X, Y, Z);
- figura
- contur (X, Y, Z, contour_amount);
- % mărci de afișare la nivel
- stai;
- plot (x (1), x (2), „k<-');
- % Punct minim de ieșire.
- plot (min_x, min_y, 'r *');
- titlu (title_plot);
- text (min_x-0,2, min_y + 0,4, 'MIN', 'BackgroundColor' [. 7 .7 .7])
- Punct de Vyvodnachalnoy% pe grafic
- text (x (1,1), x (2,1), 'A0'.
- 'BackgroundColor') [7 .7 .7.];
- % Decizia de retragere privind calendarul
- text (text_x, text_y.
- char ([ 'x1 =' num2str (x (1, LAST_NUMBER))].
- [Num2str 'X2 =' (x (2, LAST_NUMBER))].
- [ 'F () =' num2str (value_of_funct (LAST_NUMBER))].
- [ 'IteraŃiile -' num2str (number_iteration)]).
- 'BackgroundColor') [7 .7 .7.];
- capăt