MATLAB运动学之蒙特卡罗法求积分与机器人工作域分析

蒙特卡罗法又叫做统计模拟法、随机抽样技术,是一种随机模拟方法以概率和统计理论方法为基础的一种计算方法,通俗来说是可以使用随机数来解决很多计算问题的一种方法,很直观简单,尤其对于一些求解积分无解的情况,非常好使且简单粗暴。

蒙特卡罗法求面积(定积分)

y = x² 为例,我们需要求出 x 在[0,10]相对应的 y 在[0,100] 所围成的曲线面积,在我们有了微积分的知识之后,我们可以通过对这个函数的原函数做差来求解(1/3*10³-1/3*0³=1000/3),这种叫做解析解,也就是通过数学公式求出来的解。

除了这种求积分的方法,我们接下来介绍的就是蒙特卡罗法。
将大量随机点散落到整个矩形,然后计算散落在围成曲线下的点的数量的占比就可以得出曲线面积了。
曲线围成的面积=整个矩形区间的面积 * 曲线下方的点的个数的占比

需要注意的是,蒙特卡罗法的前提条件是区间的值要么全是正值,要么全是负值,如果不是的情况就分区再求积分。 

是不是有了这方法,不管什么曲线围成的面积,都不在话下,就这么简单粗暴好用哈哈。

%使用非负整数 seed 为随机数生成函数提供种子,以使 rand、randi 和 randn 生成可预测的数字序列。
rng(0);
set(0,'defaultAxesFontName', 'Monospaced');  % 防止中文乱码
set(gcf, 'position', [10, 20, 1000, 700]);
%f = suptitle('求解y=x^2定积分');
%set(f, 'fontsize', 20); 
L = 10;  % 积分区间长度
fs = 1 / 1e3; % 采样率0.001
x = 0 : fs : L;
y = x .^ 2;  
S = L * (L ^ 2);  %矩形面积,这个示例就是1000

% 随机点的数量(作对比)
N_Lis = [10, 100, 1000, 10000];

% 解析解(原函数做差值)
res_integ = 1/3 * (10^3 - 0^3); 

% 近似解
%figure(1); clf;
for n = 1 : length(N_Lis)
    cnt = 0;
    x_random = L * rand(1, N_Lis(n));  % 随机点x
    y_random = L ^ 2 * rand(1, N_Lis(n));  % 随机点y
    % 统计曲线下面的点的数量
    for i = 1 : N_Lis(n)
        if y_random(i) <= x_random(i) ^ 2
            cnt = cnt + 1;
        end
    end
    res_appro = cnt / N_Lis(n) * S;
    % 画图对比
    subplot(2, 2, n);
    plot(x, y, 'k', 'linewidth', 2); hold on;
    area(x, y, 'facecolor','c'); hold on;
    scatter(x_random, y_random, 10, 'r', 'filled', 'markerfacealpha', 0.5);
    xlabel('x'); ylabel('y'); set(gca, 'fontsize', 14);
    title(['数学解≈', num2str(res_integ, '%.1f'), '   近似解≈', num2str(res_appro, '%.1f')]);
end

可以看到当随机点从10个增加到10000个的时候,结果对比也可以知道,求出来的这个近似解就越接近解析解(真实值),那么我们在生活当中如果遇到需要求面积的情况,而且连曲线的函数都不清楚的情况下,我们应该知道如何求曲线围成的面积了,比如说,可以撒上一层豆子或者是水,水是最好的(连续,不离散),然后称量下曲线围成的豆子或者水的重量在整个矩形中的占比就可以知道围成的面积了。

无解的情况

有时候求积分是无解的情况,比如下面的三个函数所围成的面积,我们就不能通过数学公式得到解析解或者说非常困难,但是可以快速使用蒙特卡罗法来求其近似解: 

T = 20;
fs = 1 / 1e3;
x0 = -T : fs : T;
y1 = sin(x0.^ 2);
y2 = sin(x0) ./ x0;
y3 = exp(-x0.^2);

figure(1); clf;
subplot(3, 1, 1);
plot(x0, y1, 'linewidth', 1.5); ylabel('y'); title('y=sin(x^2)'); set(gca, 'fontsize', 12);
subplot(3, 1, 2);
plot(x0, y2, 'linewidth', 1.5); ylabel('y'); title('y=sin(x)/x'); set(gca, 'fontsize', 12);
subplot(3, 1, 3);
plot(x0, y3, 'linewidth', 1.5); xlabel('x'); ylabel('y'); title('y=e^{-x^2}'); set(gca, 'fontsize', 12);

% 绘制围成区域
x = 0 : fs : 2;
y11 = sin(x.^ 2);
y21 = sin(x) ./ x;
y31 = exp(-x.^2);

figure(2); clf;
plot(x, y11, 'linewidth', 1.5); hold on;
plot(x, y21, 'linewidth', 1.5); hold on;
plot(x, y31, 'linewidth', 1.5); hold on;
area(x(y11>y31 & y21>y11), y11(y11>y31 & y21>y11), 'facecolor', 'c', 'edgealpha', 0); hold on;
area(x(y11>y31 & y21>y11), y31(y11>y31 & y21>y11), 'facecolor', 'w', 'edgealpha', 0); hold on;
h = legend('y=sin(x^2)', 'y=sin(x)/x', 'y=e^{-x^2}', 'location', 'southwest');
xlabel('x'); ylabel('y'); title('求三条曲线围成的面积'); set(gca, 'fontsize', 12); set(h, 'fontsize', 12);

% 蒙特卡罗法求面积
L = 2; 
H = 3;
S = L * H;
N_Lis = [1e1, 1e2, 1e3, 1e4];
figure(3); clf;
for n = 1 : length(N_Lis)
    N = N_Lis(n);
    x_random = L * rand(1, N);
    y_random = H * rand(1, N) - 1;
    cnt = 0;
    for i = 1 : N
        if (y_random(i) <= sin(x_random(i)^2)) && (y_random(i) <= sin(x_random(i))/x_random(i)) ...
                && (y_random(i) >= exp(-x_random(i)^2))
            cnt = cnt + 1;
        end
    end
    res_appro = cnt / N * S;
    
    subplot(2, 2, n);
    plot(x, y11, 'linewidth', 1.5); hold on;
    plot(x, y21, 'linewidth', 1.5); hold on;
    plot(x, y31, 'linewidth', 1.5); hold on;
    area(x(y11>y31 & y21>y11), y11(y11>y31 & y21>y11), 'facecolor', 'c', 'edgealpha', 0); hold on;
    area(x(y11>y31 & y21>y11), y31(y11>y31 & y21>y11), 'facecolor', 'w', 'edgealpha', 0); hold on;
    scatter(x_random, y_random, 10, 'r', 'filled', 'markerfacealpha', 0.5);
    xlabel('x'); ylabel('y'); title(['样本数=', num2str(N_Lis(n)), '   近似解≈', num2str(res_appro, '%.2f')]); 
    set(gca, 'fontsize', 14); 
end

h = suptitle('蒙特卡罗法求图形面积');
set(h, 'fontsize', 18);
set(gcf, 'position', [10, 20, 800, 700]);

只需要将随机点(样本数)增加到基本覆盖整个区域,我们就可以得到所围成的图形里面的样本数的占比,这样就近似求出了这个所围成的面积了。

机器人工作区域

在机器人领域,我们也可以使用蒙特卡罗法模拟出末端执行器的运动区域,这样对于我们关注机器人的所能工作的范围有一个更直观的了解。

%定义D-H参数
a2 = 0.420;
a3 = 0.375;
d2 = 0.138 + 0.024;
d3 =-0.127 -0.024;
d4 = 0.114 + 0.021;
d5 = 0.114 + 0.021;
d6 = 0.090 + 0.021;

for i = 1:100000
%角度范围是[-pi,pi],rand返回(0,1) 内均匀分布的随机数
%模拟各关节的角度
theta1 = -pi + 2*pi*rand;
theta2 = 0 + 2*pi*rand;
theta3 =-(5/6)*pi + (5/3)*pi*rand;
theta4 = -pi + 2*pi*rand;
theta5 = -pi + 2*pi*rand;
theta6 = -pi + 2*pi*rand;

%XYZ就是关节的末端位置值(不考虑方向)
x(i) = a2*cos(theta1)*cos(theta2)+a3*cos(theta1)*cos(theta2+theta3)-d5*cos(theta1)*sin(theta2+theta3+theta4)-sin(theta1)*(d2+d3+d4)-d6*(cos(theta5)*sin(theta1)-cos(theta1)*cos(theta2+theta3+theta4)*sin(theta5));
01:46

y(i) = d6*(cos(theta1)*cos(theta5)+cos(theta2+theta3+theta4)*sin(theta1)*sin(theta5))+a3*sin(theta1)*cos(theta2+theta3)-d5*sin(theta1)*sin(theta2+theta3+theta4)+cos(theta1)*(d2+d3+d4)+a2*cos(theta2)*sin(theta1);

z(i) =-a3*sin(theta2+theta3)-a2*sin(theta2)-d5*cos(theta2+theta3+theta4)-d6*sin(theta5)*sin(theta2+theta3+theta4);
end

plot3(x,y,z,'b.','MarkerSize',0.5)

我们这里让机器人的关节随机运行10万次,也就是10万个随机点,通过plot3函数,画出这个六轴机械臂末端执行器所处空间的能够工作的范围了,基本上可以看到能够覆盖机器人所能够工作的区域了。

也可以观察XY组成的侧面,或者另外两根轴组成的侧面情况

其中中间白色圆心部分,是机械臂末端所不能运动到的地方。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/239072.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

《Easy3d+Qt+VTK》学习

《Easy3dQtVTK》学习-1、编译与配置 一、编译二、配置注 一、编译 1、 资源下载&#xff1a;easy3d giuhub 2、解压缩 3、用qt打开CMakeLists.txt即可 4、点击项目&#xff0c;选择debug或者release&#xff0c;图中3处可自行选择&#xff0c;因为我的qt版本是6&#xff0c…

Linux上使用Python的requests库进行HTTP请求

在Linux上使用Python的requests库进行HTTP请求是一种非常方便和高效的方式。requests库是一个第三方库&#xff0c;用于发送HTTP请求并获取响应。下面是一个简单的示例&#xff0c;演示如何使用requests库发送GET请求并获取响应。 首先&#xff0c;你需要安装requests库。你可…

玩转大数据15:常用的分类算法和聚类算法

前言 分类算法和聚类算法是数据挖掘和机器学习中的两种常见方法。它们的主要区别在于处理数据的方式和目标。 分类算法是在已知类别标签的数据集上训练的&#xff0c;用于预测新的数据点的类别。聚类算法则是在没有任何类别标签的情况下&#xff0c;通过分析数据点之间的相似性…

MATLAB代码:含电热联合系统的微电网运行优化

微♥关注“电击小子程高兴的MATLAB小屋”获取专属优惠 说明书 MATLAB代码&#xff1a;含电热联合系统的微电网运行优化 关键词&#xff1a;微网 电热联合系统 优化调度 参考文档&#xff1a;《含电热联合系统的微电网运行优化》完全复现 仿真平台&#xff1a;MATLAB yalmi…

vue的小练习-翻转单词

先将字符串转成数组&#xff0c;用reverse&#xff08;&#xff09;翻转数组&#xff0c;再转成字符串 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevic…

路由器的转换原理--ENSP实验

目录 一、路由器的工作原理 二、路由表的形成 1、直连路由 2、非直连路由 2.1静态路由 2.2动态路由 三、静态路由和默认路由 1、静态路由 1.1静态路由的缺点 1.2路由的配置--结合ensp实验 2、默认路由--特殊的静态路由 2.1概念 2.2格式 2.3默认路由的配置--ens…

MySQL中的回表

目录 1、表扫描和索引&#xff1a; 表扫描&#xff08;Table Scan&#xff09;&#xff1a; 索引&#xff1a; 2、聚簇索引 vs. 非聚簇索引&#xff1a; 聚簇索引&#xff08;Clustered Index&#xff09;&#xff1a; 非聚簇索引&#xff08;Non-clustered Index&#x…

mybatis多表映射-分步查询

1、建库建表 create database mybatis-example; use mybatis-example; create table t_book (bid varchar(20) primary key,bname varchar(20),stuid varchar(20) ); insert into t_book values(b001,Java,s001); insert into t_book values(b002,Python,s002); insert into …

焦炭冶金工艺3D可视化仿真展示更直观、形象

冶金行业作为重要的工业领域&#xff0c;其岗位实践培训一直面临着诸多挑战&#xff0c;随着web3d开发和VR虚拟仿真技术的不断创新和应用&#xff0c;冶金3D虚拟仿真实践教学平台应运而生&#xff0c;为钢铁生产培训带来了崭新的变革。 冶金3D虚拟仿真实践教学平台采用了先进的…

节日问候:在 Metaverse 中一起庆祝节日!

冬季即将来临&#xff0c;节日的脚步也越来越近&#xff0c;是时候通过 The Sandbox 中的最新活动——“节日问候”来迎接节日气氛了&#xff01;为期 43 天的庆祝活动从 12 月 11 日开始&#xff0c;到 1 月 22 日结束&#xff0c;将带领玩家穿越一个充满 60 种体验的冬季仙境…

QT中时间时区处理总结

最近项目中要做跨国设备时间校正功能&#xff0c;用到了时区时间&#xff0c;在此做一下记录。 目录 1.常见时区名 2.测试代码 3.运行效果 1.常见时区名 "Pacific/Midway": "中途岛 (UTC-11:00)", …

【NSX-T】搭建NSX-T环境 —— Lab 说明和准备工作

目录 Lab 说明VM列表IP地址规划使用192.168.1.0/24作为实验环境主IP网段使用192.168.2.0/24网段作为freenas存储网段NSX 网段 拓扑汇总vSphere 7vSphere 8 虚拟机部署顺序 准备工作 Lab 说明 VM列表 Y&#xff1a;表示已部署N&#xff1a;表示未部署 HostIPDomain NameOSServ…

清雪除冰,扫出“平安路” 开封市鼓楼区民政局社工组织开展除雪破冰志愿行动

近日&#xff0c;我市迎来大范围降雪天气&#xff0c;积雪融化、道路结冰、湿滑难行&#xff0c;造成居民群众出行不便和较大的交通安全隐患。为迅速清除积雪和道路结冰积水&#xff0c;保障辖区居民尤其是困境群体的出行安全&#xff0c;2023年12月11日下午&#xff0c;鼓楼区…

Kafka系列之:统计kafka集群Topic的分区数和副本数,批量增加topic副本数

Kafka系列之:统计kafka集群Topic的分区数和副本数,批量增加topic副本数 一、创建KafkaAdminClient二、获取kafka集群topic元信息三、获取每个topic的名称、分区数、副本数四、生成增加topic副本的json文件五、执行增加topic副本的命令六、确认topic增加副本是否成功一、创建K…

系列二十七、Apache Jmeter使用

一、安装 下载安装包>解压到指定目录>双击打开D:\Programs\apache-jmeter-5.5\bin\ApacheJmeter.jar即可。我分享的ApacheJmeter链接&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1VI7f3buIWZbQEeq2CRbwlg?pwdyyds 提取码&#xff1a;yyds 二、使用 2.1、添…

@CrossOrigin解决跨域不生效问题

参考文献 CrossOrigin注解没有生效&#xff0c;解决方案集合_crossorigin注解不起作用-CSDN博客

MacOS 12 开放指定端口 指定ip访问

MacOS 12 开放指定端口 指定ip访问 在 macOS 上开放一个端口&#xff0c;并指定只能特定的 IP 访问&#xff0c;你可以使用 macOS 内置的 pfctl&#xff08;Packet Filter&#xff09;工具来实现。 以下是一些基本的步骤&#xff1a; 1、 编辑 pf 配置文件&#xff1a; 打开 /…

(数据结构)单链表的定义

#include<stdio.h> typedef struct LNode {int data;struct LNode* next; }LNode,*LinkList; //LNode为结构体类型&#xff0c;LinkList为指向单链表的指针 //初始化一个空的单链表 void InitList(LinkList L) {L NULL; //空表&#xff0c;暂时没有任何节点 } //判断单…

mysql:在字符串类型的列上创建索引,建议指定索引前缀长度

https://dev.mysql.com/doc/refman/8.2/en/create-index.html#create-index-column-prefixes 在字符串类型的列上创建索引&#xff0c;建议指定索引前缀长度&#xff0c;而没有必要用整个列来创建索引。因为用前面的字符创建索引&#xff0c;查询时并不会比在整列上创建索引慢很…

Self-Distillation from the Last Mini-Batch for Consistency Regularization中文版

Self-Distillation from the Last Mini-Batch for Consistency Regularization 从上一个小批量自发蒸馏&#xff0c;实现一致性正则化 摘要 知识蒸馏&#xff08;Knowledge distillation&#xff0c;KD&#xff09;展示了强大的潜力&#xff0c;作为一种强有力的正则化策略&a…