数模方法论-无约束问题求解

铁佛  论坛元老 | 2024-9-27 23:29:01 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 1822|帖子 1822|积分 5466

一、基本概念

        无约束问题在数学建模中是指优化过程中没有任何限制条件的环境。这种问题旨在探求一个决策变量集合,使得某个目的函数(如资本、效益或其他需要优化的量)达到最大或最小值。详细来说,无约束问题通常可以表现为:

此中是
目的函数,
是决策变量。在这种环境下,优化过程仅依赖于目的函数的性质,而无需考虑其他限制条件。假设我们要最大化某公司利润,利润函数为
。这是一个无约束的优化问题,我们可以通过求导和分析得到最优解。
        无约束问题的求解方法包括但不限于:


  • 梯度下降法:通过计算目的函数的梯度,逐步调解变量值以找到最优解。
  • 牛顿法:利用二阶导数信息来加快收敛。
  • 遗传算法、粒子群优化等开导式算法:在更复杂的环境中探求近似最优解。
        无约束问题常见于经济学、工程、运筹学等范畴,适用于那些目的明确、且不受其他条件限制的优化任务。
二、例题求解

例题一

        求解多元函数
的极值

        假如在驻点处 Hessian 阵为正定阵,则在该点取极小值;假如在驻点处 Hessian 阵为负定阵则在该点取极大值;假如在驻点处 Hessian 阵为不定阵,则该驻点不是极值点。可以验证: 

Matlab求解

  1. clc, clear
  2. f=@(x) x(1)^3-x(2)^3+3*x(1)^2+3*x(2)^2-9*x(1);  %定义匿名函数
  3. g=@(x) -f(x);
  4. [xy1,z1]=fminunc(f, rand(2,1))  %求极小值点
  5. [xy2,z2]=fminsearch(g,rand(2,1)); %求极大值点
  6. xy2, z2=-z2
复制代码
Python求解

  1. import numpy as np
  2. from scipy.optimize import minimize
  3. # 定义函数 f
  4. def f(x):
  5.     return x[0]**3 - x[1]**3 + 3*x[0]**2 + 3*x[1]**2 - 9*x[0]
  6. # 求极小值点
  7. x0 = np.random.rand(2)  # 随机初始化
  8. result_min = minimize(f, x0)
  9. xy1 = result_min.x
  10. z1 = result_min.fun
  11. # 定义函数 g
  12. def g(x):
  13.     return -f(x)
  14. # 求极大值点
  15. result_max = minimize(g, np.random.rand(2))
  16. xy2 = result_max.x
  17. z2 = -result_max.fun
  18. print("最小值点:", xy1, "最小值:", z1)
  19. print("最大值点:", xy2, "最大值:", z2)
复制代码

例题二

求函数
的极小值。
Matlab求解

  1. function main()
  2.     % 主程序
  3.     % 优化 fun3
  4.     options = optimset('GradObj', 'on');
  5.     [x3, y3] = fminunc(@fun3, rand(1, 2), options);
  6.     fprintf('fun3 最小值点: [%f, %f], 最小值: %f\n', x3(1), x3(2), y3);
  7.     % 优化 fun4
  8.     options = optimset('GradObj', 'on', 'Hessian', 'on');
  9.     [x4, y4] = fminunc(@fun4, rand(1, 2), options);
  10.     fprintf('fun4 最小值点: [%f, %f], 最小值: %f\n', x4(1), x4(2), y4);
  11. end
  12. function [f, g] = fun3(x)
  13.     f = 100 * (x(2) - x(1)^2)^2 + (1 - x(1))^2;
  14.     g = [-400 * x(1) * (x(2) - x(1)^2) - 2 * (1 - x(1));
  15.           200 * (x(2) - x(1)^2)];
  16. end
  17. function [f, df, d2f] = fun4(x)
  18.     f = 100 * (x(2) - x(1)^2)^2 + (1 - x(1))^2;
  19.     df = [-400 * x(1) * (x(2) - x(1)^2) - 2 * (1 - x(1));
  20.            200 * (x(2) - x(1)^2)];
  21.     d2f = [-400 * x(2) + 1200 * x(1)^2 + 2, -400 * x(1);
  22.            -400 * x(1), 200];
  23. end
  24. % 调用主程序
  25. main();
复制代码
Python求解

  1. import numpy as np
  2. from scipy.optimize import minimize
  3. # 定义函数 fun3
  4. def fun3(x):
  5.     f = 100 * (x[1] - x[0]**2)**2 + (1 - x[0])**2
  6.     g = np.array([-400 * x[0] * (x[1] - x[0]**2) - 2 * (1 - x[0]),
  7.                   200 * (x[1] - x[0]**2)])
  8.     return f, g
  9. # 定义函数 fun4
  10. def fun4(x):
  11.     f = 100 * (x[1] - x[0]**2)**2 + (1 - x[0])**2
  12.     df = np.array([-400 * x[0] * (x[1] - x[0]**2) - 2 * (1 - x[0]),
  13.                    200 * (x[1] - x[0]**2)])
  14.     d2f = np.array([[-400 * x[1] + 1200 * x[0]**2 + 2, -400 * x[0]],
  15.                     [-400 * x[0], 200]])
  16.     return f, df, d2f
  17. # 使用 fminunc 求解最小值
  18. x0 = np.random.rand(2)
  19. # 优化 fun3
  20. result_min3 = minimize(lambda x: fun3(x)[0], x0, jac=lambda x: fun3(x)[1])
  21. x3, y3 = result_min3.x, result_min3.fun
  22. # 优化 fun4
  23. result_min4 = minimize(lambda x: fun4(x)[0], x0, jac=lambda x: fun4(x)[1],
  24.                        hess=lambda x: fun4(x)[2])
  25. x4, y4 = result_min4.x, result_min4.fun
  26. print("fun3 最小值点:", x3, "最小值:", y3)
  27. print("fun4 最小值点:", x4, "最小值:", y4)
复制代码

例题三

求函数
取极小值时候的
值。
Matlab求解

  1. function main()
  2.     % 初始值
  3.     x0 = 2;
  4.    
  5.     % 调用优化函数
  6.     [x, y] = fminsearch(@fun5, x0);
  7.    
  8.     % 输出结果
  9.     fprintf('最优点: %f, 最小值: %f\n', x, y);
  10. end
  11. function f = fun5(x)
  12.     % 目标函数
  13.     f = sin(x) + 3;
  14. end
  15. % 调用主程序
  16. main();
复制代码
Python求解

  1. import numpy as np
  2. from scipy.optimize import minimize
  3. def fun5(x):
  4.     # 目标函数
  5.     return np.sin(x) + 3
  6. def main():
  7.     # 初始值
  8.     x0 = 2
  9.    
  10.     # 调用优化函数
  11.     result = minimize(fun5, x0)
  12.    
  13.     # 输出结果
  14.     print(f'最优点: {result.x[0]:.6f}, 最小值: {result.fun:.6f}')
  15. # 调用主程序
  16. if __name__ == "__main__":
  17.     main()
复制代码

例题四

求多项式
的零点。
Matlab求解

  1. clc, clear
  2. xishu=[1 -1 2 -3]; %多项式是用向量定义的,系数从高次幂到低次幂排列
  3. x0=roots(xishu)
  4. syms x
  5. x0=solve(x^3-x^2+2*x-3) %求函数零点的符号解
  6. x0=vpa(x0,5)  %化成小数格式的数据
  7. y=@(x) x^3-x^2+2*x-3;
  8. x=fsolve(y,rand)  %只能求给定初始值附近的一个零点
复制代码
Python求解

  1. import numpy as np
  2. from scipy.optimize import fsolve
  3. from sympy import symbols, solve, N
  4. # 定义多项式系数
  5. coefficients = [1, -1, 2, -3]
  6. # 求多项式的根
  7. roots = np.roots(coefficients)
  8. print(f'多项式的根: {roots}')
  9. # 使用符号解求零点
  10. x = symbols('x')
  11. symbolic_roots = solve(x**3 - x**2 + 2*x - 3, x)
  12. symbolic_roots_decimal = [N(root, 5) for root in symbolic_roots]
  13. print(f'符号解的零点(小数格式): {symbolic_roots_decimal}')
  14. # 定义目标函数
  15. def y(x):
  16.     return x**3 - x**2 + 2*x - 3
  17. # 使用 fsolve 求给定初始值附近的一个零点
  18. initial_guess = np.random.rand()
  19. numerical_root = fsolve(y, initial_guess)
  20. print(f'给定初始值附近的零点: {numerical_root[0]}')
复制代码

例题五

        求方程组的解

Matlab求解

  1. syms x y
  2. [x,y]=solve(x^2+y-6,y^2+x-6)
  3. f=@(x) [x(1)^2+x(1)-6; x(2)^2+x(1)-6];
  4. xy=fsolve(f,rand(2,1)) %只能求给定初始值附近的一组解
复制代码
Python求解

  1. import numpy as np
  2. from scipy.optimize import fsolve
  3. from sympy import symbols, solve
  4. # 定义符号变量
  5. x, y = symbols('x y')
  6. # 求解方程组
  7. solutions = solve((x**2 + y - 6, y**2 + x - 6), (x, y))
  8. print(f'方程组的符号解: {solutions}')
  9. # 定义目标函数
  10. def equations(vars):
  11.     x_val, y_val = vars
  12.     return [x_val**2 + y_val - 6, y_val**2 + x_val - 6]
  13. # 使用 fsolve 求解
  14. initial_guess = np.random.rand(2)
  15. numerical_solution = fsolve(equations, initial_guess)
  16. print(f'给定初始值附近的解: {numerical_solution}')
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

铁佛

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表