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

ops/2024/9/24 16:17:38/

一、基本概念

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

\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/ops/115351.html

相关文章

CSS中的多种关系选择器

后代选择器 选择所有被E元素包含的F元素&#xff0c;中间用空格隔开。 例&#xff1b; <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title…

南京服务器测评【浪浪云】

前言 优质的服务器对于企业来说无疑是一把快速实现科技化成长的利剑。而南京&#xff0c;作为中国科技龙头之一的城市&#xff0c;也对服务器的需求愈发旺盛。而作为国内领先的云服务商&#xff0c;浪浪云致力于用科技培植企业的成长&#xff0c;其在南京的服务器便是企业数字化…

KITTI数据集雷达采样点时间戳属性的思考(Failed to find match for field ‘time‘)

最近在SLAM调研期间&#xff0c;看到了FAST-LIO2以及Point-lio这两个比较新的SLAM建图算法&#xff0c;想着上手编译并且运行一下&#xff0c;选择了自己了解到的比较出名的数据集KITTI&#xff0c;想着在上述两个开源算法上上手跑一下&#xff08;原论文并没有使用KITTI数据集…

【Power Compiler手册】13.UPF多电压设计实现(5)

细化供电集 要重新定义供电集的功能,请使用`create_supply_set`命令的`-update`选项。必须同时使用`-update`和`-function`选项,以将功能名称与供电网络或端口关联起来。 以下示例展示了如何使用`-update`选项将供电网络与供电集的功能关联: create_power_domain PD_TOP c…

【人工智能学习笔记】7_智能语音技术基础

智能语音技术概述 智能语音技术通过对语音进行分析、理解和合成,是计算机设备实现“能听会说”、具备自然语音交流的技术能力。其涉及的范围主要有: 语音合成技术语音识别技术语音测评技术语音降噪与增强技术…智能语音技术的研究内容 智能语音技术的研究难点 智能语音技术…

LAMP(Linux、Apache、MySQL、PHP)环境搭建和项目部署 编译安装 全流程!

文章目录 LAMP架构LAMP架构组件LAMP架构的工作流程LAMP组件的安装顺序 编译安装 Apache HTTP 服务器1. 关闭防火墙并准备安装所需软件包2. 安装环境依赖包3. 配置软件模块4. 编译及安装5. 优化配置文件路径6. 添加 httpd 服务到系统服务管理7. 修改 httpd 服务配置文件8. 浏览器…

(Python) Structured Streaming读取Kafka源实时处理图像

Producer.py import cv2 from kafka import KafkaProducer import os import os.path as osp# Kafka 服务器地址 bootstrap_servers [xxx.xxx.xxx.xxx:9092] #terminal运行ifconfig可以查看localhost# 创建 Kafka 生产者 producer KafkaProducer(bootstrap_serversbootstrap…

IR21364的代替品SLM21364CF-DG:带过流保护、使能和故障反馈 高压三相半桥驱动芯片 神秘芯片背后的惊人力量

SLM21364CF-DG是一款高压、高速的三相功率MOSFET和IGBT驱动器。采用专有的高压集成电路和锁存免疫CMOS技术&#xff0c;提供可靠的单芯片驱动方案。逻辑输入电平与标准CMOS或LSTTL输出兼容&#xff0c;最低支持3.3V逻辑。通过检测外部电流电阻上电流&#xff0c;过流保护功能能…