首页 > 其他分享 >数模方法论-无约束问题求解

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

时间:2024-09-23 17:20:52浏览次数:8  
标签:方法论 求解 无约束 最小值 数模 result np import x0

一、基本概念

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

\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求解

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.fun

print("最小值点:", xy1, "最小值:", z1)
print("最大值点:", xy2, "最大值:", z2)

例题二

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

Matlab求解

function main()
    % 主程序

    % 优化 fun3
    options = optimset('GradObj', 'on');
    [x3, y3] = fminunc(@fun3, rand(1, 2), options);
    fprintf('fun3 最小值点: [%f, %f], 最小值: %f\n', x3(1), x3(2), y3);

    % 优化 fun4
    options = optimset('GradObj', 'on', 'Hessian', 'on');
    [x4, y4] = fminunc(@fun4, rand(1, 2), options);
    fprintf('fun4 最小值点: [%f, %f], 最小值: %f\n', x4(1), x4(2), y4);
end

function [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)];
end

function [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求解

import numpy as np
from scipy.optimize import minimize

# 定义函数 fun3
def fun3(x):
    f = 100 * (x[1] - x[0]**2)**2 + (1 - x[0])**2
    g = 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])**2
    df = 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.fun

print("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);
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[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求解

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求解

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 [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}')

标签:方法论,求解,无约束,最小值,数模,result,np,import,x0
From: https://blog.csdn.net/qq_41489047/article/details/142448935

相关文章

  • 2024“华为杯”数模研赛E数据提取代码
    2024年数学建模研究生赛E题从视频中提取数据的代码。主要包括三个部分:车流量计算、各车道车流量计算和平均速度计算。主要讲述了代码的使用方法,包括需要修改的参数和文件路径,以及一些特殊情况的处理方法。同时还提供了参数估计和绘图的相关代码,以及如何根据不同视频视角调整代码......
  • C++中模板的初级使用函数模板(刚刚接触模板概念的小白也能明白)
    文章目录模板分类函数模板函数模板的原理函数模板基本语法——typename以及class简单的函数模板多类型模板参数class和typename的选择类模板模板分类模板的核心思想是让编译器在编译时生成适用于具体类型的代码,这个过程称为模板实例化。C++中的模板分为两种:......
  • C++容器list底层迭代器的实现逻辑~list相关函数模拟实现
    目录1.两个基本的结构体搭建2.实现push_back函数3.关于list现状的分析(对于我们如何实现这个迭代器很重要)3.1和string,vector的比较3.2对于list的分析3.3总结4.迭代器类的封装5.list容器里面其他函数的实现6.个人总结7.代码附录1.两个基本的结构体搭建首先就是我......
  • 软件开发的方法论:Supra模型
    Supra模型是一种用于软件开发的方法论,特别是在需求工程领域。它提供了一种系统化的方式来识别、分析和管理软件项目的需求。Supra模型强调在整个软件生命周期中持续地关注用户需求,并且通过迭代的方式逐步细化和完善这些需求。这个名字“Supra”并不是一个广泛认可的标准术语,因此可......
  • 数模原理精解【11】
    文章目录logistic模型多元回归分析多元回归分析概览1.多元回归的概念与重要性2.多元回归在实际应用中的例子3.多元回归在预测和解释数据中的优势和局限性4.多元回归的优缺点及改进建议多元线性回归分析详解一、原理二、性质三、计算四、例子与例题五、应用场景六、......
  • 代数模型(Algebraic Models)---线性规划------+ 案例 + Python源码求解(见文中)
    目录一、代数模型(AlgebraicModels)详解1.1什么是代数模型?1.2代数模型的基本形式1.3安装所需要的Python包--运行下述案例1.4代数模型的应用案例案例1:市场供需平衡模型Python求解代码Python求解结果如下图:案例2:运输问题中的线性规划模型进行数学建模分析1.目标函数2.......
  • LLM驱动的NL2SQL方法论:现状、难点、优化
    阅读原文NL2SQL在大型语言模型(LLM)的支持下得到了广泛应用,为了对基于LLM的NL2SQL解决方案进行系统化研究,我们需要全面理解和实践,包括Prompt工程、指令微调(SFT)、Agent、RAG等技术方案。为深入研究NL2SQL提供一些参考和指导。1.什么是NL2SQL简言之,NaturalLanguagetoSQL......
  • C++ 模板基础知识——可变参数模板
    目录C++模板基础知识——可变参数模板1.可变参函数模板1.1基本含义1.2利用constexprif优化递归函数1.3关于constexprif的进一步理解1.4重载2.折叠表达式2.1一元左折(UnaryLeftFold)2.2一元右折(UnaryRightFold)2.3二元左折(BinaryLeftFold)2.4二元右折......
  • AI助力水体保护区无人值守垂钓智能预警,基于YOLOv10全系列【n/s/m/b/l/x】参数模型开发
    保护我们赖以生存的自然生态环境,无疑是一项意义深远且需要长期坚持的任务。自然界的生态系统,由水、气、森林、土壤等多要素组成,它们相互依存、相互影响,共同维系着地球的生态平衡。然而,在人类活动的影响下,这一平衡正遭受着前所未有的挑战。因此,加强环境监管治理,保护我们的自然资......
  • C语言——使用回调函数模拟实现qsort
    同学们还记得之前我们已经学过一种排序方法叫“冒泡排序“嘛。代码直接附上咯voidbubble_sort(intarr[],intsz){ inti=0;//趟数 for(i=0;i<sz-1;i++) { intj=0; for(j=0;j<sz-i-1;j++) { if(arr[j]>arr[j+1]) { inttmp=......