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

embedded/2024/9/24 10:56:46/

一、基本概念

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

\text{minimize (or maximize) f(x)}

其中是f(x)目标函数,x是决策变量。在这种情况下,优化过程仅依赖于目标函数的性质,而无需考虑其他限制条件。假设我们要最大化某公司利润,利润函数为f(x)=-x^{2}+4x。这是一个无约束的优化问题,我们可以通过求导和分析得到最优解。

        无约束问题的求解方法包括但不限于:

  • 梯度下降法:通过计算目标函数的梯度,逐步调整变量值以找到最优解。
  • 牛顿法:利用二阶导数信息来加速收敛。
  • 遗传算法、粒子群优化等启发式算法:在更复杂的情形中寻找近似最优解。

        无约束问题常见于经济学、工程、运筹学等领域,适用于那些目标明确、且不受其他条件限制的优化任务。

二、例题求解

例题一

        求解多元函数f(x,y)=x^{3}-y^{3}+3x^{2}+3y^{2}-9x的极值

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

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);
[xy1,z1]=fminunc(f, rand(2,1))  %求极小值点
[xy2,z2]=fminsearch(g,rand(2,1)); %求极大值点
xy2, z2=-z2

Python求解

python">import numpy as np
from scipy.optimize import minimize# 定义函数 f
def f(x):return x[0]**3 - x[1]**3 + 3*x[0]**2 + 3*x[1]**2 - 9*x[0]# 求极小值点
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.funprint("最小值点:", xy1, "最小值:", z1)
print("最大值点:", xy2, "最大值:", z2)

例题二

求函数f( x ) =100 ( x_{2} -x_{1}^{2} )^{2} + ( 1 -x_{1} )^{2}的极小值。

Matlab求解

function main()% 主程序% 优化 fun3options = optimset('GradObj', 'on');[x3, y3] = fminunc(@fun3, rand(1, 2), options);fprintf('fun3 最小值点: [%f, %f], 最小值: %f\n', x3(1), x3(2), y3);% 优化 fun4options = optimset('GradObj', 'on', 'Hessian', 'on');[x4, y4] = fminunc(@fun4, rand(1, 2), options);fprintf('fun4 最小值点: [%f, %f], 最小值: %f\n', x4(1), x4(2), y4);
endfunction [f, g] = 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)];
endfunction [f, df, d2f] = 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求解

python">import numpy as np
from scipy.optimize import minimize# 定义函数 fun3
def fun3(x):f = 100 * (x[1] - x[0]**2)**2 + (1 - x[0])**2g = np.array([-400 * x[0] * (x[1] - x[0]**2) - 2 * (1 - x[0]),200 * (x[1] - x[0]**2)])return f, g# 定义函数 fun4
def fun4(x):f = 100 * (x[1] - x[0]**2)**2 + (1 - x[0])**2df = np.array([-400 * x[0] * (x[1] - x[0]**2) - 2 * (1 - x[0]),200 * (x[1] - x[0]**2)])d2f = np.array([[-400 * x[1] + 1200 * x[0]**2 + 2, -400 * x[0]],[-400 * x[0], 200]])return f, df, d2f# 使用 fminunc 求解最小值
x0 = np.random.rand(2)# 优化 fun3
result_min3 = minimize(lambda x: fun3(x)[0], x0, jac=lambda x: fun3(x)[1])
x3, y3 = result_min3.x, result_min3.fun# 优化 fun4
result_min4 = minimize(lambda x: fun4(x)[0], x0, jac=lambda x: fun4(x)[1],hess=lambda x: fun4(x)[2])
x4, y4 = result_min4.x, result_min4.funprint("fun3 最小值点:", x3, "最小值:", y3)
print("fun4 最小值点:", x4, "最小值:", y4)

例题三

求函数f(x) = \sin( x ) + 3取极小值时候的x值。

Matlab求解

function main()% 初始值x0 = 2;% 调用优化函数[x, y] = fminsearch(@fun5, x0);% 输出结果fprintf('最优点: %f, 最小值: %f\n', x, y);
endfunction f = fun5(x)% 目标函数f = sin(x) + 3;
end% 调用主程序
main();

Python求解

python">import numpy as np
from scipy.optimize import minimizedef fun5(x):# 目标函数return np.sin(x) + 3def main():# 初始值x0 = 2# 调用优化函数result = minimize(fun5, x0)# 输出结果print(f'最优点: {result.x[0]:.6f}, 最小值: {result.fun:.6f}')# 调用主程序
if __name__ == "__main__":main()

例题四

求多项式f( x ) =x^{3} -x^{2} +2x -3的零点。

Matlab求解

clc, clear
xishu=[1 -1 2 -3]; %多项式是用向量定义的,系数从高次幂到低次幂排列
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求解

python">import numpy as np
from scipy.optimize import fsolve
from sympy import symbols, solve, N# 定义多项式系数
coefficients = [1, -1, 2, -3]# 求多项式的根
roots = np.roots(coefficients)
print(f'多项式的根: {roots}')# 使用符号解求零点
x = symbols('x')
symbolic_roots = solve(x**3 - x**2 + 2*x - 3, x)
symbolic_roots_decimal = [N(root, 5) for root in symbolic_roots]
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[0]}')

例题五

        求方程组的解\begin{cases}x^2 + y - 6 = 0\\y^2 + x - 6 = 0\end{cases}

Matlab求解

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

Python求解

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 = varsreturn [x_val**2 + y_val - 6, y_val**2 + x_val - 6]# 使用 fsolve 求解
initial_guess = np.random.rand(2)
numerical_solution = fsolve(equations, initial_guess)
print(f'给定初始值附近的解: {numerical_solution}')


http://www.ppmy.cn/embedded/116058.html

相关文章

Centos 7 搭建Samba

笔记: 环境:VMware Centos 7(网络请选择桥接模式,不要用NAT) 遇到一个问题就是yum 安装404,解决办法在下面(没有遇到可以无视这句话) # 安装Samba软件 yum -y install samba# 创建…

深度学习:(五)初识神经网络

(一)神经网络的层数 除去输入层,但包括输出层,每一层都有自己的参数。 输入层称为第零层。 (二)最简单的神经网络(逻辑回归) 下图中的小圆圈,代表了一种运算。且一个小…

如何从格式化的笔记本电脑或台式机中恢复照片

您想学习如何从已格式化的笔记本电脑或台式机中恢复已删除的照片吗?这篇文章解释了如何使用最佳格式的照片恢复软件来做到这一点。您可以通过简单的步骤格式化计算机后恢复已删除的图像。 将照片保存在笔记本电脑或 PC 硬盘上是很常见的。与相机存储卡和 USB 闪存驱…

【玩转贪心算法专题】763. 划分字母区间【中等】

【玩转贪心算法专题】763. 划分字母区间【中等】 1、力扣链接 https://leetcode.cn/problems/partition-labels/description/ 2、题目描述 给你一个字符串 s 。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。 注意,划分结…

MySQL(面试题 - 同类型归纳面试题)

目录 一、MySQL 数据类型 1. 数据库存储日期格式时,如何考虑时区转换问题? 2. Blob和text有什么区别? 3. mysql里记录货币用什么字段类型比较好? 4. MySQL如何获取当前日期? 5. 你们数据库是否支持emoji表情存储&…

【随手笔记】使用J-LINK读写芯片内存数据

第一种使用JLINK.exe 1. 打开j-link.exe 2.输入【usb】 3. 连接芯片 输入【connect】输入芯片型号【STM32L071RB】输入连接方式 【S】 使用SWD连接方式输入连接速率 【4000】连接成功 4. 输入【&#xff1f;】查看指令提示 5. 读写指令 Mem Mem [<Zone>…

MPP架构

MPP&#xff08;Massively Parallel Processing&#xff09;架构是一种数据库或计算架构&#xff0c;通过高度并行的处理能力来处理和分析大型数据集。该架构利用多个处理节点或服务器来并行执行计算任务&#xff0c;从而显著提高性能和处理速度。以下是关于 MPP 架构的一些关键…

框架漏洞(5-rce s2-057 CVE-2017-8046 CVE-2018-1273 Shiro-550)

5-rce 步骤一&#xff1a;环境部署 cd vulhub/thinkphp/5-rce docker-compose up -d 步骤二&#xff1a;输入系统命令: whoami /index.php?sindex/think\app/invokefunction&functioncall_user_func_array&vars[0]system&vars[1][]whoami 步骤三&#xff1a;写…