铁佛 发表于 2024-9-27 23:29:01

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

一、基本概念

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