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

本文主要是介绍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));  % 随机点xy_random = L ^ 2 * rand(1, N_Lis(n));  % 随机点y% 统计曲线下面的点的数量for i = 1 : N_Lis(n)if y_random(i) <= x_random(i) ^ 2cnt = cnt + 1;endendres_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 : Nif (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;endendres_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); 
endh = 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:46y(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);
endplot3(x,y,z,'b.','MarkerSize',0.5)

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

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

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

这篇关于MATLAB运动学之蒙特卡罗法求积分与机器人工作域分析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/485773

相关文章

Go使用pprof进行CPU,内存和阻塞情况分析

《Go使用pprof进行CPU,内存和阻塞情况分析》Go语言提供了强大的pprof工具,用于分析CPU、内存、Goroutine阻塞等性能问题,帮助开发者优化程序,提高运行效率,下面我们就来深入了解下... 目录1. pprof 介绍2. 快速上手:启用 pprof3. CPU Profiling:分析 C

MySQL表锁、页面锁和行锁的作用及其优缺点对比分析

《MySQL表锁、页面锁和行锁的作用及其优缺点对比分析》MySQL中的表锁、页面锁和行锁各有特点,适用于不同的场景,表锁锁定整个表,适用于批量操作和MyISAM存储引擎,页面锁锁定数据页,适用于旧版本... 目录1. 表锁(Table Lock)2. 页面锁(Page Lock)3. 行锁(Row Lock

Springboot中分析SQL性能的两种方式详解

《Springboot中分析SQL性能的两种方式详解》文章介绍了SQL性能分析的两种方式:MyBatis-Plus性能分析插件和p6spy框架,MyBatis-Plus插件配置简单,适用于开发和测试环... 目录SQL性能分析的两种方式:功能介绍实现方式:实现步骤:SQL性能分析的两种方式:功能介绍记录

最长公共子序列问题的深度分析与Java实现方式

《最长公共子序列问题的深度分析与Java实现方式》本文详细介绍了最长公共子序列(LCS)问题,包括其概念、暴力解法、动态规划解法,并提供了Java代码实现,暴力解法虽然简单,但在大数据处理中效率较低,... 目录最长公共子序列问题概述问题理解与示例分析暴力解法思路与示例代码动态规划解法DP 表的构建与意义动

C#使用DeepSeek API实现自然语言处理,文本分类和情感分析

《C#使用DeepSeekAPI实现自然语言处理,文本分类和情感分析》在C#中使用DeepSeekAPI可以实现多种功能,例如自然语言处理、文本分类、情感分析等,本文主要为大家介绍了具体实现步骤,... 目录准备工作文本生成文本分类问答系统代码生成翻译功能文本摘要文本校对图像描述生成总结在C#中使用Deep

利用Python编写一个简单的聊天机器人

《利用Python编写一个简单的聊天机器人》这篇文章主要为大家详细介绍了如何利用Python编写一个简单的聊天机器人,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 使用 python 编写一个简单的聊天机器人可以从最基础的逻辑开始,然后逐步加入更复杂的功能。这里我们将先实现一个简单的

Redis主从/哨兵机制原理分析

《Redis主从/哨兵机制原理分析》本文介绍了Redis的主从复制和哨兵机制,主从复制实现了数据的热备份和负载均衡,而哨兵机制可以监控Redis集群,实现自动故障转移,哨兵机制通过监控、下线、选举和故... 目录一、主从复制1.1 什么是主从复制1.2 主从复制的作用1.3 主从复制原理1.3.1 全量复制

Redis主从复制的原理分析

《Redis主从复制的原理分析》Redis主从复制通过将数据镜像到多个从节点,实现高可用性和扩展性,主从复制包括初次全量同步和增量同步两个阶段,为优化复制性能,可以采用AOF持久化、调整复制超时时间、... 目录Redis主从复制的原理主从复制概述配置主从复制数据同步过程复制一致性与延迟故障转移机制监控与维

SSID究竟是什么? WiFi网络名称及工作方式解析

《SSID究竟是什么?WiFi网络名称及工作方式解析》SID可以看作是无线网络的名称,类似于有线网络中的网络名称或者路由器的名称,在无线网络中,设备通过SSID来识别和连接到特定的无线网络... 当提到 Wi-Fi 网络时,就避不开「SSID」这个术语。简单来说,SSID 就是 Wi-Fi 网络的名称。比如

Redis连接失败:客户端IP不在白名单中的问题分析与解决方案

《Redis连接失败:客户端IP不在白名单中的问题分析与解决方案》在现代分布式系统中,Redis作为一种高性能的内存数据库,被广泛应用于缓存、消息队列、会话存储等场景,然而,在实际使用过程中,我们可能... 目录一、问题背景二、错误分析1. 错误信息解读2. 根本原因三、解决方案1. 将客户端IP添加到Re