楼主: 大家开心
11777 60

[教材书籍] Optimization: Algorithms and Applications   [推广有奖]

51
Lisrelchen 发表于 2016-1-25 07:33:59 |只看作者 |坛友微信交流群
  1. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  2. % MATLAB code bisection.m
  3. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  4. %
  5. % a-> lower bound of the design variable
  6. % b> upper bound of the design variable
  7. % alpha -> midpoint of a and b
  8. % delx -> ?x for central difference method
  9. % derivative -> derivative using central difference method
  10. % derivative_alpha -> derivative at x = alpha
  11. % abs -> absolute of a number, MATLAB function
  12. %
  13. clear all
  14. clc
  15. a = 40;
  16. b = 90;
  17. epsilon = 0.01;
  18. delx = 0.01;
  19. fprintf('    a             b     \n' )
  20. fprintf('-------------------------\n' )

  21. for i= 1:100
  22. fprintf(' %7.3f      %8.3f \n',a,b)
  23. alpha = (a+b)/2;
  24. derivative = (func(a+delx) - func(a-delx) )/(2*delx);
  25. derivative_alpha = (func(alpha+delx)- func(alpha-delx))/(2*delx);
  26. if (derivative*derivative_alpha) < 0
  27.                     b = alpha;
  28. else
  29.             a = alpha;
  30. end

  31. if abs(a-b) < epsilon
  32.                     break;
  33. end
  34. end

  35. fprintf('-------------------------\n' )
  36. fprintf('x* =  %7.3f       Minimum =   %8.3f\n',a,func(a))
  37. fprintf('Number of function calls =     %3d\n',4*i)
  38. %
  39. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
复制代码

使用道具

52
Lisrelchen 发表于 2016-1-25 07:34:50 |只看作者 |坛友微信交流群
  1. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  2. % MATLAB code cubic
  3. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  4. %
  5. % a-> lower bound of the design variable
  6. % b> upper bound of the design variable
  7. % alpha -> midpoint of a and b
  8. % delx -> ?x for central difference method
  9. % derivative -> derivative using central difference method
  10. % derivative_alpha -> derivative at x = alpha
  11. % abs -> absolute of a number, MATLAB function
  12. % flag -> set the flag when minimum is bracketed
  13. % derivative_a -> derivative at point a
  14. % derivative_b -> derivative at b
  15. %
  16. a = 40;
  17. b = 90;
  18. delx = 0.01;
  19. flag = 0;
  20. epsilon= 0.001;
  21. fprintf('    a             b     \n' )
  22. fprintf('-------------------------\n' )

  23. for i= 1:100
  24. alpha = (a+b)/2;
  25. derivative = (func(a+delx) - func(a-delx) )/(2*delx);
  26. derivative_alpha = (func(alpha+delx)-func(alpha-delx) )/(2*delx);
  27. if (derivative*derivative_alpha) < 0
  28.     b = alpha;
  29.     flag = 1;
  30. else
  31.     a = alpha;
  32. end
  33. if flag == 1
  34.     break;
  35. end
  36. end

  37. for j=1:100
  38. fprintf(' %7.3f      %8.3f \n',a,b)
  39. derivative_a = (func(a+delx) - func(a-delx) )/(2*delx);
  40. derivative_b = (func(b+delx) - func(b-delx) )/(2*delx);
  41. z = 3*(func(a)-func(b))/(b-a) + derivative_a + derivative_b;
  42. w = ((b-a)/abs(b-a))*sqrt(z*z-derivative_a*derivative_b);
  43. mew = (derivative_b+w-z)/(derivative_b-derivative_a+2*w);
  44. if mew <= 1
  45.     x_opt = b - mew*(b-a);
  46. else
  47.     x_opt = a;
  48. end
  49. alpha1 = (func(x_opt+delx) - func(x_opt-delx) )/(2*delx);
  50. if abs(alpha1) < epsilon
  51.     break;
  52. else
  53.    if (derivative_a*alpha1) < 0
  54.     b = x_opt;
  55. else
  56.     a = x_opt;
  57. end
  58. end

  59. end

  60. fprintf('-------------------------\n' )
  61. fprintf('x* =  %7.3f       Minimum =   %8.3f\n',x_opt,func(x_opt))
  62. fprintf('Number of function calls =     %3d\n',4*i+8*j)
  63. %
  64. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
复制代码

使用道具

53
Lisrelchen 发表于 2016-1-25 07:35:47 |只看作者 |坛友微信交流群
  1. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  2. % MATLAB code golden.m
  3. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  4. %
  5. % a-> lower bound of the design variable
  6. % b> upper bound of the design variable
  7. % alpha -> midpoint of a and b
  8. % falpha1 -> function value at x = alpha1
  9. % falpha2 -> function value at x = alpha2
  10. % epsilon -> constant used to terminate the algorithm
  11. % abs -> absolute of a number, MATLAB function
  12. % tau -> 2-golden number
  13. %
  14. clear all
  15. clc
  16. a = 40;
  17. b = 90;
  18. epsilon = 0.00001;
  19. tau = 0.381967;
  20. alpha1 = a*(1-tau) + b*tau;
  21. alpha2 = a*tau + b*(1-tau);
  22. falpha1 = func(alpha1);
  23. falpha2 = func(alpha2);

  24. fprintf('    a             b     \n' )
  25. fprintf('-------------------------\n' )

  26. for i= 1:100
  27.     fprintf(' %7.3f      %8.3f \n',a,b)
  28.     if falpha1 > falpha2
  29.         a = alpha1;
  30.         alpha1 = alpha2;
  31.         falpha1 = falpha2;
  32.         alpha2 = tau*a + (1-tau)*b;
  33.         falpha2 = func(alpha2);
  34.     else
  35.         b = alpha2;
  36.         alpha2 = alpha1;
  37.         falpha2 = falpha1;
  38.         alpha1 = tau*b + (1-tau)*a;
  39.         falpha1 = func(alpha1);
  40.     end

  41. if abs(func(alpha1)-func(alpha2))< epsilon
  42.     break;
  43. end
  44. end

  45. fprintf('-------------------------\n' )
  46. fprintf('x* =  %7.3f       Minimum =   %8.3f\n',alpha1,func(alpha1))
  47. fprintf('Number of function calls =     %3d\n',2+i)
  48. %
  49. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
复制代码

使用道具

54
Lisrelchen 发表于 2016-1-25 07:36:21 |只看作者 |坛友微信交流群
  1. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  2. % MATLAB code newtonraphson.m
  3. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  4. %
  5. % x -> initial guess of design variable
  6. % delx -> ?x for central difference method
  7. % derivative -> derivative using central difference method
  8. % sec_derivative -> second derivative
  9. % epsilon -> constant used to terminate the program
  10. % xprev -> value of x stored from previous iteration
  11. %
  12. clear all
  13. clc
  14. x = 45;
  15. delx = 0.01;
  16. epsilon = 0.01;
  17. fprintf('     x    f(x)      Deriv. Second deriv.\n' )
  18. fprintf('-----------------------------------------\n' )

  19. for i= 1:100
  20. derivative = (func(x+delx) - func(x-delx) )/(2*delx);
  21. sec_derivative=(func(x+delx)+func(x-delx)-2*func(x))/(delx*delx);
  22. fprintf('%8.3f %8.3f %8.3f %8.3f\n',x,func(x),derivative,      sec_derivative)
  23. xprev = x;
  24. x = x- derivative/sec_derivative;
  25. if abs(x-xprev) < epsilon
  26.     break;
  27. end
  28. end

  29. fprintf('-----------------------------------------\n' )
  30. fprintf('Number of function calls =     %3d\n',5*i)

  31. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
复制代码

使用道具

55
Lisrelchen 发表于 2016-1-25 07:36:56 |只看作者 |坛友微信交流群
  1. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  2. % MATLAB code secant.m
  3. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  4. %
  5. % a-> lower bound of the design variable
  6. % b> upper bound of the design variable
  7. % alpha -> midpoint of a and b
  8. % delx -> ?x for central difference method
  9. % derivative -> derivative using central difference method
  10. % derivative_alpha -> derivative at x = alpha
  11. % abs -> absolute of a number, MATLAB function
  12. % flag -> set the flag when minimum is bracketed
  13. %
  14. clear all
  15. clc
  16. a = 40;
  17. b = 90;
  18. epsilon = 0.001;
  19. delx = 0.01;
  20. flag = 0;
  21. fprintf('  Alpha          Deriv.  \n' )
  22. fprintf('-------------------------\n' )

  23. for i= 1:100
  24. alpha = (a+b)/2;
  25. derivative = (func(a+delx) - func(a-delx) )/(2*delx);
  26. derivative_alpha = (func(alpha+delx)-func(alpha-delx) )/(2*delx);
  27. if (derivative*derivative_alpha) < 0
  28.     b = alpha;
  29.     flag = 1;
  30. else
  31.     a = alpha;
  32. end
  33. if flag == 1
  34.     break;
  35. end
  36. end

  37. for  j = 1:100
  38. fprintf(' %7.3f      %8.3f \n',alpha,derivative_alpha)
  39. derivative_a = (func(a+delx) - func(a-delx) )/(2*delx);
  40. derivative_b = (func(b+delx) - func(b-delx) )/(2*delx);
  41. alpha = b - derivative_b*(b-a)/(derivative_b-derivative_a);
  42. derivative_alpha =(func(alpha+delx) -func(alpha-delx) )/(2*delx);
  43. if derivative_alpha > 0
  44.     b = alpha;
  45. else
  46.     a = alpha;
  47. end
  48. if abs(derivative_alpha) < epsilon
  49.     break;
  50. end
  51. end
  52. fprintf('-------------------------\n' )
  53. fprintf('x* =  %7.3f       Minimum =   %8.3f\n',alpha,func(alpha))
  54. fprintf('Number of function calls =     %3d\n',4*i+6*j)
  55. %
  56. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
复制代码

使用道具

56
Luzhaoyang 发表于 2016-5-10 16:03:35 |只看作者 |坛友微信交流群
Thanks a lot!   ddddddddddddd

使用道具

57
sacromento 学生认证  发表于 2017-6-28 09:07:47 |只看作者 |坛友微信交流群
谢谢分享啊!

使用道具

58
doushiyu 发表于 2018-3-17 05:48:36 |只看作者 |坛友微信交流群
谢谢分享~

使用道具

59
tianwk 发表于 2019-4-24 16:18:51 |只看作者 |坛友微信交流群
thanks for sharing

使用道具

60
shuaifirst 发表于 2021-11-20 23:48:42 |只看作者 |坛友微信交流群
thank you so much

使用道具

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加JingGuanBbs
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-4-20 06:58