Advertisement
Guest User

task1

a guest
Dec 5th, 2019
97
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.13 KB | None | 0 0
  1. clc
  2. a = -1.5; b = -0.5;
  3. delta = 0.1;
  4. Passive_Search(a, b, 10^-4)
  5. Dichotomia(a, b, delta)
  6. Gold_Section(a, b)
  7. Fibonacci(a, b)
  8. Newton(a, b)
  9.  
  10.  
  11. function value = y(x)
  12. global func_call
  13. value = 26*x.^6 + 21*x.^5 + 18*x.^4 + 4*x.^3 + 10*x.^2 + 15*x.^1 + sin(13*x) + sin(6*x) + sin(3*x);
  14. func_call = func_call + 1;
  15. end
  16.  
  17. function value = dy(x)
  18. global func_call
  19. value = 156*x.^5 + 105*x.^4 + 72*x.^3 + 12*x.^2 + 20*x.^1 + 15 + 13*cos(13*x) + 6*cos(6*x) + 3*cos(3*x);
  20. func_call = func_call + 1;
  21. end
  22.  
  23. function value = ddy(x)
  24. global func_call
  25. value = 780*x.^4 + 420*x.^3 + 216*x.^2 + 24*x.^1 + 20 - 169*sin(13*x) - 36*sin(6*x) - 9*sin(3*x);
  26. func_call = func_call + 1;
  27. end
  28.  
  29. function value = r_d(number)
  30. exponent = floor(log10(abs(number))); % порядок старшей цифры
  31. amount = 4; % нужное количество верных цифр
  32. value = 10^(exponent - amount + 1)/2;
  33. end
  34.  
  35. function Passive_Search(a, b, epsilon)
  36. introduction = sprintf('\t\t\t\t Метод пассивного поиска\n');
  37. fprintf(introduction)
  38. counter = 0;
  39. min = y(a);
  40. for i = a:epsilon:b
  41. if y(i)<min
  42. min = y(i);
  43. argument = i;
  44. end
  45. counter = counter + 1;
  46. end
  47. formatSpec = 'X is %.3f, Y is %.3f, Count is %.f \n';
  48. fprintf(formatSpec, argument, min, counter-1)
  49. end
  50.  
  51. function Dichotomia(a, b, delta)
  52. introduction = sprintf('\t\t\t\t Метод дихотомии\n');
  53. fprintf(introduction)
  54. global func_call
  55. counter = 0;
  56. func_call = 0;
  57. while b-a > 2*r_d((a+b/2))
  58. Delta_b = delta*(b-a);
  59. c = (a+b)/2 - Delta_b;
  60. d = (a+b)/2 + Delta_b;
  61. if y(c) <= y(d)
  62. counter = counter + 1;
  63. b = d;
  64. argument = c;
  65. min = y(c);
  66. formatSpec = 'X is %.4f, Y is %.3f, Count is %.f, Number of function calls %.f, Segment is [%.4f, %.4f] \n';
  67. fprintf(formatSpec, argument, min, counter, func_call, a, b)
  68. else
  69. counter = counter + 1;
  70. a = c;
  71. argument = d;
  72. min = y(d);
  73. formatSpec = 'X is %.4f, Y is %.3f, Count is %.f, Number of function calls %.f, Segment is [%.4f, %.4f] \n';
  74. fprintf(formatSpec, argument, min, counter, func_call, a, b)
  75. end
  76. end
  77.  
  78. while b-a > 6*Delta_b
  79. Delta_b = delta*(b-a);
  80. c = (a+b)/2 - Delta_b;
  81. d = (a+b)/2 + Delta_b;
  82. if y(c) <= y(d)
  83. counter = counter + 1;
  84. b = d;
  85. argument = c;
  86. min = y(c);
  87. formatSpec = 'X is %.4f, Y is %.3f, Count is %.f, Number of function calls %.f, Segment is [%.4f, %.4f] \n';
  88. fprintf(formatSpec, argument, min, counter, func_call, a, b)
  89. else
  90. counter = counter + 1;
  91. a = c;
  92. argument = d;
  93. min = y(d);
  94. formatSpec = 'X is %.4f, Y is %.3f, Count is %.f, Number of function calls %.f, Segment is [%.4f, %.4f] \n';
  95. fprintf(formatSpec, argument, min, counter, func_call, a, b)
  96. end
  97. end
  98. end
  99.  
  100. function Gold_Section(a, b)
  101. introduction = sprintf('\t\t\t\t Метод золотого сечения\n');
  102. fprintf(introduction)
  103. counter = 0;
  104. global func_call
  105. func_call = 0;
  106. c = (3-sqrt(5))/2*(b-a) + a;
  107. d = (sqrt(5)-1)/2*(b-a) + a;
  108. y_c = y(c);
  109. y_d = y(d);
  110. while b-a > 2*r_d((a+b)/2)
  111. if y_c <= y_d
  112. b = d;
  113. d = c;
  114. y_d = y_c;
  115. c = (3-sqrt(5))/2*(b-a) + a;
  116. y_c = y(c);
  117. argument = (a+b)/2;
  118. min = y(argument);
  119. counter = counter + 1;
  120. formatSpec = 'X is %.4f, Y is %.3f, Count is %.f, Number of function calls %.f, Segment is [%.4f, %.4f] \n';
  121. fprintf(formatSpec, argument, min, counter, func_call, a, b)
  122. else
  123. a = c;
  124. c = d;
  125. y_c = y_d;
  126. d = (sqrt(5)-1)/2*(b-a) + a;
  127. y_d = y(d);
  128. argument = (a+b)/2;
  129. min = y(argument);
  130. counter = counter + 1;
  131. formatSpec = 'X is %.4f, Y is %.3f, Count is %.f, Number of function calls %.f, Segment is [%.4f, %.4f] \n';
  132. fprintf(formatSpec, argument, min, counter, func_call, a, b)
  133. end
  134. end
  135. if y(c) < min
  136. counter = counter + 1;
  137. argument = c;
  138. min = y(c);
  139. formatSpec = 'X is %.4f, Y is %.3f, Count is %.f, Number of function calls %.f, Segment is [%.4f, %.4f] \n';
  140. fprintf(formatSpec, argument, min, counter, func_call, a, b)
  141. elseif y(d) < min
  142. counter = counter + 1;
  143. argument = d;
  144. min = y(d);
  145. formatSpec = 'X is %.4f, Y is %.3f, Count is %.f, Number of function calls %.f, Segment is [%.4f, %.4f] \n';
  146. fprintf(formatSpec, argument, min, counter, func_call, a, b)
  147. end
  148. end
  149.  
  150. function Fibonacci(a, b)
  151. introduction = sprintf('\t\t\t\t Метод Фибоначчи\n');
  152. fprintf(introduction)
  153. global func_call
  154. func_call = 0;
  155. counter = 0;
  156. fib_array = [1 1 2 3 5];
  157. index = 2;
  158. while (b-a)/r_d((a+b)/2) > fib_array(index)
  159. index = index + 1;
  160. fib_array(index) = fib_array(index-2) + fib_array(index-1);
  161. end
  162.  
  163. i = index;
  164. c = a + (b-a)*fib_array(i-2)/fib_array(i);
  165. d = a + (b-a)*fib_array(i-1)/fib_array(i);
  166. y_c = y(c);
  167. y_d = y(d);
  168. while b-a > 2*r_d((a+b/2))
  169. if y_c <= y_d
  170. b = d;
  171. d = c;
  172. y_d = y_c;
  173. c = a + (b-a)*fib_array(i-2)/fib_array(i);
  174. y_c = y(c);
  175. argument = (a+b)/2;
  176. min = y(argument);
  177. counter = counter + 1;
  178. i = i - 1;
  179. formatSpec = 'X is %.4f, Y is %.3f, Count is %.f, Number of function calls %.f, Segment is [%.4f, %.4f] \n';
  180. fprintf(formatSpec, argument, min, counter, func_call, a, b)
  181. else
  182. a = c;
  183. c = d;
  184. y_c = y_d;
  185. d = a + (b-a)*fib_array(i-1)/fib_array(i);
  186. y_d = y(d);
  187. argument = (a+b)/2;
  188. min = y(argument);
  189. counter = counter + 1;
  190. i = i - 1;
  191. formatSpec = 'X is %.4f, Y is %.3f, Count is %.f, Number of function calls %.f, Segment is [%.4f, %.4f] \n';
  192. fprintf(formatSpec, argument, min, counter, func_call, a, b)
  193. end
  194. end
  195. if y(c) < min
  196. counter = counter + 1;
  197. argument = c;
  198. min = y(c);
  199. formatSpec = 'X is %.4f, Y is %.3f, Count is %.f, Number of function calls %.f, Segment is [%.4f, %.4f] \n';
  200. fprintf(formatSpec, argument, min, counter, func_call, a, b)
  201. elseif y(d) < min
  202. counter = counter + 1;
  203. argument = d;
  204. min = y(d);
  205. formatSpec = 'X is %.4f, Y is %.3f, Count is %.f, Number of function calls %.f, Segment is [%.4f, %.4f] \n';
  206. fprintf(formatSpec, argument, min, counter, func_call, a, b)
  207. end
  208. end
  209.  
  210. function Newton(a, b)
  211. introduction = sprintf('\t\t\t\t Метод касательных(Ньютона)\n');
  212. fprintf(introduction)
  213. dddy = @(x) 2*(12+120*x+960*x.^3-1000*cos(10*x)-864*cos(12*x)-2197*cos(13*x)-2916*cos(18*x));
  214. if dy(a)*dddy(a) > 0
  215. x0 = a;
  216. x1 = b;
  217. else
  218. x0 = b;
  219. x1 = a;
  220. end
  221. global func_call
  222. func_call = 2;
  223. counter = 0;
  224. current_epsilon = realmax;
  225. while current_epsilon > r_d((a+b/2))
  226. counter = counter + 1;
  227. x1 = x0 - dy(x0)/ddy(x0);
  228. current_epsilon = abs(x1 - x0);
  229. minumum = y(x1);
  230. tmp = [x0, x1];
  231. formatSpec = 'X is %.4f, Y is %.3f, Count is %.f, Number of function calls %.f, Segment is [%.4f, %.4f] \n';
  232. fprintf(formatSpec, x1, minumum, counter, func_call, min(tmp), max(tmp))
  233. x0 = x1;
  234. end
  235. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement