当前位置: 首页 > article >正文

数学建模 第三节

目录

前言

一  钻井布局问题

第一问分析

第二问分析

总结


前言

这里讲述99年的钻井布局问题,利用这个问题讲述模型优化,LINGO,MATLAB的使用


一  钻井布局问题

这个是钻井布局的原题,坐标的位置为
a = [0.50,1.41,3.00,3.37,3.40,4.72,4.72,5.43,7.57,8.38,8.98,9.50];
b = [2.00,3.50,1.50,3.51,5.50,2.00,6.24,4.10,2.01,4.50,3.41,0.80];
这个a是每一个井的横坐标,b是每一个井的纵坐标

第一问分析

题意:我们要去移动网格,然后这个井的x坐标和y坐标距离这个网格的点的x坐标和y坐标的的误差可以再0.05之内,这个是十分重要的
我们先用MATLAB把这个图画出来

代码如下

a=[0.50,1.41,3.00,3.37,3.40,4.72,4.72,5.43,7.57,8.38,8.98,9.50];
b=[2.00,3.50,1.50,3.51,5.50,2.00,6.24,4.10,2.01,4.50,3.41,0.80];
plot(a,b,'o');//画点
grid;  //显示表格
for i = 1:12text(a(i)+0.1,b(i),int2str(i));//显示坐标点的标记
end    

然后我们要去根据题意知道这个模型要怎么进行构建
模型就是我们0---1变量规划,算法中就是背包问题,选择还是不选择,选择是1,不选择是0,然后只要把这些值加起来就好了,因为我们就最多就是12口井,那全部取1的话,那不就是12吗,向下很多人都听懂这个了

我们可以进行总结一下,这个就是选择和不选择的问题

所以我们有一个变量肯定是要记录0和1的,那么我们就找到了一个变量了,在创建模型中,变量是十分关键的,现在我们创建了一个变量就是0,1的f
然后剩下变量不就是我们上面的x坐标和y坐标嘛
然后还有一个就是我们平移,平移多少呢?我们不知道,所以设一个x和y,因为x和y都要移动嘛
现在我们就有5个变量了

这个是我们建立的第一个模型
我们可以看到这个就是利用了水井坐标减去方格坐标的绝对值小于0.05,为什么呢?读者自己思考,因为这个很关键,讲出来的话就没意义了
然后f就是我们所说的01变量,但是这个模型好像编写不出来,为什么?
因为我们的式子要和01变量进行有所关联,所以我们直接这样就好了

然后我们就得到了关联,这个时候我们可以先用LINGO进行编写或者MATLAB编写
LINGO

sets:aa/1..12/:s,b,f;
endsetsdata:s = 0.50,1.41,3.00,3.37,3.40,4.72,4.72,5.43,7.57,8.38,8.98,5.50;b = 2.00,3.50,1.50,3.51,5.50,2.00,6.24,4.10,2.01,4.50,3.41,0.80;
enddataMax = @sum(aa(i):f(i));x<1;
x>0;
y<1;
y>0;@for(aa(i):@abs(s(i)+x-@floor(s(i)+x+0.5))*f(i)<=0.05);
@for(aa(i):@abs(b(i)+y-@floor(b(i)+y+0.5))*f(i)<=0.05);
@for(aa(i):@bin(f(i)));

这里讲解一下语法,可能很多读者不着调这个语法
首先这个sets是创建集合的,endset是结束创建集合,这里你可以理解一个数组,sdf是aa的元素,然后这个sfd里面都有12个元素,这个元素你可以自己进行赋值,如果只有一个的话,那就直接向我写x和y一样就好了
然后这个data是进行赋值的区域enddata是结束赋值的语句,这是一一对应的
然后后面就是for循环,这个for循环前面aa你可以想象成for循环的里面的三个表达式,aa就是位置,然后循环12次
MATLAB

a=[0.50,1.41,3.00,3.37,3.40,4.72,4.72,5.43,7.57,8.38,8.98,9.50];
b=[2.00,3.50,1.50,3.51,5.50,2.00,6.24,4.10,2.01,4.50,3.41,0.80];
m = 0;
d = 0;
c=[];
e=[];
for x=0:0.01:1aa = a + x;for y=0:0.01:1bb = b + y;n = 0;for i = 1:12if abs(aa(i) - round(aa(i))) <= 0.05 && abs(bb(i) - round(bb(i))) <= 0.05n = n + 1;c(end + 1) = i;end    end  if m < nm = n;e = c;endc = [];end
end   

这个m的值就是我们的答案,这个MATLAB跟我们c差不多,这里就不多介绍了,很简单
 

第二问分析

第二问就是在第一问的基础上加了一个旋转
那我们是先旋转还是先平移呢?
其实都可以,我这里选择的是先旋转,读者可以自行思考另外一个情况
我们要知道我们已经知道了这个点的坐标,那么我们就要把他基于原点的角度知道,这里使用arctan就好了,可以直接求取角度,在原有的角度上进行增加角度,然后转动的只后把这个x和y计算出来,在井的坐标上加上就好了,这个就是旋转,平移更上述的一样
首先我们先要利用MATLAB来进行变成才好理解构建模型

a = [0.50,1.41,3.00,3.37,3.40,4.72,4.72,5.43,7.57,8.38,8.98,9.50];
b = [2.00,3.50,1.50,3.51,5.50,2.00,6.24,4.10,2.01,4.50,3.41,0.80];
max = 0;
rr = atan(b./a);
long = sqrt(a.^2 + b.^2);for ang = 0:0.01:pi*2for x = 0:0.01:1for y = 0:0.01:1m = 0;for i = 1:12xx = long(i) * cos(rr(i) + ang);yy = long(i) * sin(rr(i) + ang);aa = xx + x;bb = yy + y;if sqrt((aa - round(aa))^2 + (bb - round(bb))^2) <= 0.05m = m + 1;endend if max < mmax = m; end   endend     
end    

我们利用原长来计算这个转动的x和y然后再加上平移就好了,注意这里的是计算欧里距离,别弄错了,如果这个理解了之后就可以进行模型的搭建了,这里是作者自己构建的,每个模型都是不一样,但是意思正确即可

这个是作者自己构建的,有了这个模型我们就可以再LINGO上面敲出来了

sets:aa/1..12/:a,b,f,p,ang1,ang2,liang1,liang2,c;
endsetsdata:a = 0.50,1.41,3.00,3.37,3.40,4.72,4.72,5.43,7.57,8.38,8.98,9.50;b = 2.00,3.50,1.50,3.51,5.50,2.00,6.24,4.10,2.01,4.50,3.41,0.80;
enddatacalc:
@for(aa(i):c(i)=@atan(b(i)/a(i)));
@for(aa(i):p(i)=@sqrt(a(i)^2 + b(i)^2));
endcalcmax = @sum(aa(i):f(i));
@for(aa(i):@bin(f(i)));
x<1;
y<1;
w<3.14/2;
@for(aa(i):ang1(i)=@cos(c(i)+w));
@for(aa(i):ang2(i)=@sin(c(i)+w));
!@for(aa(i):liang1(i)=p(i)*ang1(i));
!@for(aa(i):liang2(i)=p(i)*ang2(i));
!@for(aa(i):@free(liang1(i)));
!@for(aa(i):@free(liang2(i)));
@for(aa(i):@free(ang1(i)));
@for(aa(i):@free(ang2(i)));
@for(aa(i):@sqrt((p(i)*ang1(i) + x -@floor(p(i)*ang1(i) + x + 0.5))^2 + (p(i)*ang2(i) + y-@floor(p(i)*ang2(i) + y + 0.5))^2)*f(i)<=0.05);

由于我们的编程的刚开始的算法很慢,然后作者就加了注释不断地优化,这里calc是数值区域,其他就是条件区域,这里要知道才可以进行算法地优化
最后地答案是6
然后这里要设置自由变量,因为lINGO是他这个角度地cos和sin如果取到了负值就默认正值,所以要设置为自由变量


总结

这里主要是非线性规划,怎么看出来的,因为乘以了未知量,模型地构建就是要抓住变量和约束条件,然后还理解了LINGO和MATLAB这两个工具地好处和编写

相关文章:

数学建模 第三节

目录 前言 一 钻井布局问题 第一问分析 第二问分析 总结 前言 这里讲述99年的钻井布局问题&#xff0c;利用这个问题讲述模型优化&#xff0c;LINGO&#xff0c;MATLAB的使用 一 钻井布局问题 这个是钻井布局的原题&#xff0c;坐标的位置为 a [0.50,1.41,3.00,3.37,3…...

单调队列【C/C++】

当我在网上搜索了一大堆单调队列的文章后&#xff0c; 我人傻了&#xff01;&#xff1f; 单调队列不应该很难吗&#xff1f;&#xff1f; 不应该是&#xff0c;像 优先队列 那样&#xff0c;站在 堆 的肩膀上&#xff0c;极尽升华吗&#xff1f;&#xff1f;&#xff1f; …...

Spark DataFrame、Dataset 和 SQL 解析原理深入解析(万字长文多张原理图)

目录 1. Spark SQL 概述 1.1 Spark 整体架构概览 1.2 DataFrame 与 Dataset 简介 2. RDD 与 Spark 的分布式架构基础 2.1 弹性分布式数据集(RDD) 2.2 Spark 的分布式执行模型 3. SQL 解析流程与 Catalyst 优化器 3.1 SQL 解析流程概述 3.2 解析阶段与抽象语法树(AST…...

算法系列——有监督学习——3.逻辑回归

一、概述 逻辑回归是一种学习某个事件发生概率的算法。利用这个概率&#xff0c;可以对某个事件发生或不发生进行二元分类。虽然逻辑回归本来是二元分类的算法&#xff0c;但也可以用于三种类别以上的分类问题。为了理解这个算法&#xff0c;请思考以下例子。 你在回家的路上发…...

深入理解traceroute命令及其原理

traceroute 是一个网络诊断工具&#xff08;Windows上叫tracert&#xff09;&#xff0c;用于显示数据包从本地主机到远程主机经过的路由&#xff08;跳数&#xff09;。它可以帮助您了解数据包在网络中的传输路径&#xff0c;以及每跳的延迟情况。这对于网络故障排除、分析网络…...

前后端联调解决跨域问题的方案

引言 在前后端分离的开发模式中&#xff0c;前端和后端通常在不同的服务器或端口运行&#xff0c;这样就会面临跨域问题。跨域问题是指浏览器因安全限制阻止前端代码访问与当前网页源不同的域、协议或端口的资源。对于 Java 后端应用&#xff0c;我们可以通过配置 CORS&#x…...

深入解析 .NET 中的依赖项加载机制:原理、实现与最佳实践

在现代应用程序的开发中&#xff0c;依赖项管理与加载是非常重要的组成部分&#xff0c;尤其是在大型系统中&#xff0c;如何高效地加载和管理依赖项可以极大地影响应用程序的性能、可维护性和扩展性。在 .NET 中&#xff0c;依赖项加载不仅涉及静态依赖的管理&#xff0c;还包…...

【vue2 + Cesium】相机视角移动+添加模型、模型点击事件

参考文章&#xff1a;vue2 使用 cesium 【第二篇-相机视角移动添加模型】 这篇文章在上篇文章的基础上继续开发&#xff0c;主要实现效果 相机视角移动 添加模型 点击事件 上篇文章&#xff1a;【vue2 Cesium】使用Cesium、添加第三方地图、去掉商标、Cesium基础配置、地…...

【AI】AI编程助手:Cursor、Codeium、GitHub Copilot、Roo Cline、Tabnine

文章目录 一、基本特性对比二、收费标准三、私有部署能力1、Tabnine2、Roo Code 三、代码补全与自然语言生成代码四、安装独立的IDE安装插件安装 五、基本使用&#xff08;一&#xff09;Cursor&#xff08;二&#xff09;GitHub Copilot1、获取代码建议2.聊天1&#xff09;上下…...

我的uniapp自定义模板

uniapp自定义模板 如有纰漏请谅解&#xff0c;以官方文档为准后面这段时间我会学习小程序开发的知识&#xff0c;会持续更新可以查看我的github&#xff0c;后续我会上传我的uniapp相关练习代码有兴趣的话可以浏览我的个人网站&#xff0c;我会在上面持续更新内容&#xff0c;…...

如何将MediaPipe编译成Android中Chaquopy插件可用的 .whl 文件

环境准备 操作系统&#xff1a;建议使用 Ubuntu 20.04 或者 macOS&#xff08;这篇博客会以 Ubuntu 为例&#xff09;。Python 版本&#xff1a;Python 3.7 或以上版本。Android Studio&#xff1a;配置好 Android Studio 和 Android NDK&#xff08;Native Development Kit&a…...

华为OD机试-绘图机器-双指针(Java 2025 A卷 100分)

题目描述 绘图机器的绘图笔初始位置在原点 (0, 0)。机器启动后按照以下规则绘制直线: 尝试沿着横坐标正向绘制直线,直到给定的终点 E。期间可以通过指令在纵坐标轴方向进行偏移,offsetY 为正数表示正向偏移,为负数表示负向偏移。给定的横坐标终点值 E 以及若干条绘制指令,…...

【C++】动态规划从入门到精通

一、动态规划基础概念详解 什么是动态规划 动态规划&#xff08;Dynamic Programming&#xff0c;DP&#xff09;是一种通过将复杂问题分解为重叠子问题&#xff0c;并存储子问题解以避免重复计算的优化算法。它适用于具有以下两个关键性质的问题&#xff1a; 最优子结构&…...

OpenCV计算摄影学(23)艺术化风格化处理函数stylization()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 风格化的目的是生成不以照片写实为目标的多种多样数字图像效果。边缘感知滤波器是风格化处理的理想选择&#xff0c;因为它们能够弱化低对比度区…...

S32K144外设实验(三):ADC单通道连续采样(中断)

这次的实验比较简单&#xff0c;主要目的就是验证一下ADC的中断功能&#xff0c;思路是使用软件触发ADC的连续单通道采样&#xff0c;将采样值通过串口发送到上位机观察数是否正确。 其实官方并不推荐使用中断的方式&#xff0c;这种方式会占用大量的CPU资源&#xff0c;笔者安…...

LeetCode 第19~21题

LeetCode 第19题&#xff1a;删除链表的倒数第N个结点 题目描述 给你一个链表&#xff0c;删除链表的倒数第n个结点&#xff0c;并且返回链表的头结点。 难度&#xff1a;中等 题目链接&#xff1a;19. 删除链表的倒数第 N 个结点 - 力扣&#xff08;LeetCode&#xff09; 示例…...

Web3 时代数据保护的关键挑战与应对策略

Web3 时代数据保护的关键挑战与应对策略 随着互联网技术的飞速发展&#xff0c;我们正步入 Web3 时代&#xff0c;这是一个以去中心化、用户主权和数据隐私为核心的新时代。在这个时代&#xff0c;数据保护成为了一个至关重要的议题。本文将探讨 Web3 时代数据保护面临的主要挑…...

为什么labelme框选图片后闪退

Labelme 软件框选图片后闪退的解决方案 Labelme 是一种常用的图像标注工具&#xff0c;但在实际使用过程中可能会遇到一些问题&#xff0c;比如框选图片后程序突然闪退。以下是针对该问题的具体分析和解决方法&#xff1a; 可能原因及对应解决措施 标签文件异常 如果某些图片…...

‌C# I/O 核心用法

在 C# 中&#xff0c;输入输出&#xff08;I/O&#xff09;操作是处理文件、目录、流等数据交互的核心功能。本文将从基础到高级&#xff0c;系统讲解 C# 中文件 I/O 的实现方式、最佳实践及常见场景解决方案。 一、核心类与命名空间‌ 1‌、System.IO 命名空间‌&#xff0c…...

SpringBoot之如何集成SpringDoc最详细文档

文章目录 一、概念解释1、OpenAPI2、Swagger3、Springfox4、Springdoc5. 关系与区别 二、SpringDoc基本使用1、导包2、正常编写代码&#xff0c;不需要任何注解3、运行后访问下面的链接即可 三、SpringDoc进阶使用1、配置文档信息2、配置文档分组3、springdoc的配置参数**1. 基…...

Oracle 数据迁移至 GaussDB 注意事项

将数据从 Oracle 迁移到 GaussDB&#xff08;华为分布式数据库&#xff09;时&#xff0c;需充分考虑架构差异、语法兼容性、数据一致性等核心问题。以下是关键注意事项及操作建议&#xff1a; 一、迁移前的准备工作 兼容性评估 语法差异&#xff1a;Oracle 使用 PL/SQL&#x…...

【智能体】| 知识库、RAG概念区分以及智能体是什么

文章目录 前言简介大模型“幻觉”问题如何解决“幻觉”问题&#xff1f; RAG、智能体、RAG智能体概念什么是检索增强型生成&#xff08;RAG&#xff09;模拟简单的RAG场景 AI系统中的智能体是什么什么是Agentic RAG&#xff1f;Agentic RAG如何工作&#xff1f;Agentic RAG架构…...

二分查找的应用

什么时候用二分查找&#xff1f; 数据具有二段性的时候 第一题&#xff1a; 题解代码&#xff1a; class Solution { public:int search(vector<int>& nums, int target) {int left 0,right nums.size()-1;while(left<right){int mid left (right-left)/2;//中…...

Android Compose 框架基础按钮模块深度剖析(四)

Android Compose 框架基础按钮模块深度剖析 一、引言 在现代 Android 应用开发中&#xff0c;Android Compose 框架以其声明式编程范式和简洁高效的开发体验&#xff0c;逐渐成为开发者构建用户界面的首选。而注解在 Android Compose 框架中扮演着至关重要的角色&#xff0c;…...

redis搭建一主一从+keepalived(虚拟IP)实现高可用

redis搭建一主一从keepalived(虚拟IP)实现高可用 前提 有两台机器&#xff1a;如 10.50.3.141 10.50.3.142&#xff0c;虚拟ip如&#xff1a;10.50.3.170 安装redis&#xff08;两台机器执行&#xff09;: # 启用Remi仓库&#xff08;CentOS 7&#xff09; sudo yum install…...

【Function】Azure Function通过托管身份或访问令牌连接Azure SQL数据库

【Function】Azure Function通过托管身份或访问令牌连接Azure SQL数据库 推荐超级课程: 本地离线DeepSeek AI方案部署实战教程【完全版】Docker快速入门到精通Kubernetes入门到大师通关课AWS云服务快速入门实战目录 【Function】Azure Function通过托管身份或访问令牌连接Azu…...

MySQL日志全解析:类型、用途与运维实践

引言 MySQL作为最流行的关系型数据库之一&#xff0c;其日志系统是运维人员理解数据库状态、排查问题、保证数据安全的核心工具。不同类型的日志记录了数据库活动、错误信息、数据变更等关键内容。本文将深入解析MySQL各类日志的作用、配置参数及运维注意事项&#xff0c;帮助…...

《算法笔记》9.2小节——数据结构专题(2)->二叉树的遍历 问题 A: 复原二叉树(同问题 C: 二叉树遍历)

题目描述 小明在做数据结构的作业&#xff0c;其中一题是给你一棵二叉树的前序遍历和中序遍历结果&#xff0c;要求你写出这棵二叉树的后序遍历结果。 输入 输入包含多组测试数据。每组输入包含两个字符串&#xff0c;分别表示二叉树的前序遍历和中序遍历结果。每个字符串由…...

小程序开发中的用户反馈收集与分析

我们在开发小程序的过程中根据开发过程中的代码及业务场景,以下是针对需求管理系统的用户反馈收集与分析方案设计: 需求管理系统用户反馈收集与分析方案 一、反馈数据模型设计 // 新增Feedback模型(app/admin/model/Feedback.php) namespace app\admin\model; use think\…...

Flink 通过 Chunjun Oracle LogMiner 实时读取 Oracle 变更日志并写入 Doris 的方案

文章目录 一、 技术背景二、 关键技术1、 Oracle LogMiner2、 Chunjun 的 LogMiner 关键流程3、修复 Chunjun Oracle LogMiner 问题 一、 技术背景 在大数据实时同步场景中&#xff0c;需要将 Oracle 数据库的变更数据&#xff08;CDC&#xff09; 采集并写入 Apache Doris&am…...