数模方法论-无约束问题求解
一、基本概念无约束问题在数学建模中是指优化过程中没有任何限制条件的环境。这种问题旨在探求一个决策变量集合,使得某个目的函数(如资本、效益或其他需要优化的量)达到最大或最小值。详细来说,无约束问题通常可以表现为:
https://latex.csdn.net/eq?%5Ctext%7Bminimize%20%28or%20maximize%29%20f%28x%29%7D
此中是https://latex.csdn.net/eq?f%28x%29目的函数,https://latex.csdn.net/eq?x是决策变量。在这种环境下,优化过程仅依赖于目的函数的性质,而无需考虑其他限制条件。假设我们要最大化某公司利润,利润函数为https://latex.csdn.net/eq?f%28x%29%3D-x%5E%7B2%7D+4x。这是一个无约束的优化问题,我们可以通过求导和分析得到最优解。
无约束问题的求解方法包括但不限于:
[*]梯度下降法:通过计算目的函数的梯度,逐步调解变量值以找到最优解。
[*]牛顿法:利用二阶导数信息来加快收敛。
[*]遗传算法、粒子群优化等开导式算法:在更复杂的环境中探求近似最优解。
无约束问题常见于经济学、工程、运筹学等范畴,适用于那些目的明确、且不受其他条件限制的优化任务。
二、例题求解
例题一
求解多元函数https://latex.csdn.net/eq?f%28x%2Cy%29%3Dx%5E%7B3%7D-y%5E%7B3%7D+3x%5E%7B2%7D+3y%5E%7B2%7D-9x的极值
https://i-blog.csdnimg.cn/direct/0dfb6d676bab45dca7aaa3e9d85dc3c3.png
假如在驻点处 Hessian 阵为正定阵,则在该点取极小值;假如在驻点处 Hessian 阵为负定阵则在该点取极大值;假如在驻点处 Hessian 阵为不定阵,则该驻点不是极值点。可以验证:
https://i-blog.csdnimg.cn/direct/35bd3f0210cc45dda35417d45f846f54.png
Matlab求解
clc, clear
f=@(x) x(1)^3-x(2)^3+3*x(1)^2+3*x(2)^2-9*x(1);%定义匿名函数
g=@(x) -f(x);
=fminunc(f, rand(2,1))%求极小值点
=fminsearch(g,rand(2,1)); %求极大值点
xy2, z2=-z2
Python求解
import numpy as np
from scipy.optimize import minimize
# 定义函数 f
def f(x):
return x**3 - x**3 + 3*x**2 + 3*x**2 - 9*x
# 求极小值点
x0 = np.random.rand(2)# 随机初始化
result_min = minimize(f, x0)
xy1 = result_min.x
z1 = result_min.fun
# 定义函数 g
def g(x):
return -f(x)
# 求极大值点
result_max = minimize(g, np.random.rand(2))
xy2 = result_max.x
z2 = -result_max.fun
print("最小值点:", xy1, "最小值:", z1)
print("最大值点:", xy2, "最大值:", z2)
https://i-blog.csdnimg.cn/direct/f6716f5d8ad94e9ba7b605dd3a72ca07.png
例题二
求函数https://latex.csdn.net/eq?f%28%20x%20%29%20%3D100%20%28%20x_%7B2%7D%20-x_%7B1%7D%5E%7B2%7D%20%29%5E%7B2%7D%20+%20%28%201%20-x_%7B1%7D%20%29%5E%7B2%7D的极小值。
Matlab求解
function main()
% 主程序
% 优化 fun3
options = optimset('GradObj', 'on');
= fminunc(@fun3, rand(1, 2), options);
fprintf('fun3 最小值点: [%f, %f], 最小值: %f\n', x3(1), x3(2), y3);
% 优化 fun4
options = optimset('GradObj', 'on', 'Hessian', 'on');
= fminunc(@fun4, rand(1, 2), options);
fprintf('fun4 最小值点: [%f, %f], 最小值: %f\n', x4(1), x4(2), y4);
end
function = fun3(x)
f = 100 * (x(2) - x(1)^2)^2 + (1 - x(1))^2;
g = [-400 * x(1) * (x(2) - x(1)^2) - 2 * (1 - x(1));
200 * (x(2) - x(1)^2)];
end
function = fun4(x)
f = 100 * (x(2) - x(1)^2)^2 + (1 - x(1))^2;
df = [-400 * x(1) * (x(2) - x(1)^2) - 2 * (1 - x(1));
200 * (x(2) - x(1)^2)];
d2f = [-400 * x(2) + 1200 * x(1)^2 + 2, -400 * x(1);
-400 * x(1), 200];
end
% 调用主程序
main();
Python求解
import numpy as np
from scipy.optimize import minimize
# 定义函数 fun3
def fun3(x):
f = 100 * (x - x**2)**2 + (1 - x)**2
g = np.array([-400 * x * (x - x**2) - 2 * (1 - x),
200 * (x - x**2)])
return f, g
# 定义函数 fun4
def fun4(x):
f = 100 * (x - x**2)**2 + (1 - x)**2
df = np.array([-400 * x * (x - x**2) - 2 * (1 - x),
200 * (x - x**2)])
d2f = np.array([[-400 * x + 1200 * x**2 + 2, -400 * x],
[-400 * x, 200]])
return f, df, d2f
# 使用 fminunc 求解最小值
x0 = np.random.rand(2)
# 优化 fun3
result_min3 = minimize(lambda x: fun3(x), x0, jac=lambda x: fun3(x))
x3, y3 = result_min3.x, result_min3.fun
# 优化 fun4
result_min4 = minimize(lambda x: fun4(x), x0, jac=lambda x: fun4(x),
hess=lambda x: fun4(x))
x4, y4 = result_min4.x, result_min4.fun
print("fun3 最小值点:", x3, "最小值:", y3)
print("fun4 最小值点:", x4, "最小值:", y4)
https://i-blog.csdnimg.cn/direct/1a57f416a0a045feb206cd104fef58ed.png
例题三
求函数https://latex.csdn.net/eq?f%28x%29%20%3D%20%5Csin%28%20x%20%29%20+%203取极小值时候的https://latex.csdn.net/eq?x值。
Matlab求解
function main()
% 初始值
x0 = 2;
% 调用优化函数
= fminsearch(@fun5, x0);
% 输出结果
fprintf('最优点: %f, 最小值: %f\n', x, y);
end
function f = fun5(x)
% 目标函数
f = sin(x) + 3;
end
% 调用主程序
main();
Python求解
import numpy as np
from scipy.optimize import minimize
def fun5(x):
# 目标函数
return np.sin(x) + 3
def main():
# 初始值
x0 = 2
# 调用优化函数
result = minimize(fun5, x0)
# 输出结果
print(f'最优点: {result.x:.6f}, 最小值: {result.fun:.6f}')
# 调用主程序
if __name__ == "__main__":
main()
https://i-blog.csdnimg.cn/direct/180c50143ff64cfca1cde6851df20061.png
例题四
求多项式https://latex.csdn.net/eq?f%28%20x%20%29%20%3Dx%5E%7B3%7D%20-x%5E%7B2%7D%20+2x%20-3的零点。
Matlab求解
clc, clear
xishu=; %多项式是用向量定义的,系数从高次幂到低次幂排列
x0=roots(xishu)
syms x
x0=solve(x^3-x^2+2*x-3) %求函数零点的符号解
x0=vpa(x0,5)%化成小数格式的数据
y=@(x) x^3-x^2+2*x-3;
x=fsolve(y,rand)%只能求给定初始值附近的一个零点
Python求解
import numpy as np
from scipy.optimize import fsolve
from sympy import symbols, solve, N
# 定义多项式系数
coefficients =
# 求多项式的根
roots = np.roots(coefficients)
print(f'多项式的根: {roots}')
# 使用符号解求零点
x = symbols('x')
symbolic_roots = solve(x**3 - x**2 + 2*x - 3, x)
symbolic_roots_decimal =
print(f'符号解的零点(小数格式): {symbolic_roots_decimal}')
# 定义目标函数
def y(x):
return x**3 - x**2 + 2*x - 3
# 使用 fsolve 求给定初始值附近的一个零点
initial_guess = np.random.rand()
numerical_root = fsolve(y, initial_guess)
print(f'给定初始值附近的零点: {numerical_root}')
https://i-blog.csdnimg.cn/direct/1efe72af59ff4cf1ae0079639b4d0405.png
例题五
求方程组的解https://latex.csdn.net/eq?%5Cbegin%7Bcases%7Dx%5E2%20+%20y%20-%206%20%3D%200%5C%5Cy%5E2%20+%20x%20-%206%20%3D%200%5Cend%7Bcases%7D。
Matlab求解
syms x y
=solve(x^2+y-6,y^2+x-6)
f=@(x) ;
xy=fsolve(f,rand(2,1)) %只能求给定初始值附近的一组解
Python求解
import numpy as np
from scipy.optimize import fsolve
from sympy import symbols, solve
# 定义符号变量
x, y = symbols('x y')
# 求解方程组
solutions = solve((x**2 + y - 6, y**2 + x - 6), (x, y))
print(f'方程组的符号解: {solutions}')
# 定义目标函数
def equations(vars):
x_val, y_val = vars
return
# 使用 fsolve 求解
initial_guess = np.random.rand(2)
numerical_solution = fsolve(equations, initial_guess)
print(f'给定初始值附近的解: {numerical_solution}')
https://i-blog.csdnimg.cn/direct/e31776136bd84de394e1ee51d440c38a.png
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页:
[1]