北太天元是面向科学计算与工程计算的国产通用型科学计算软件,提供科学计算、可视化、交互式程序设计,具备丰富的底层数学函数库,支持数值计算、数据分析、数据可视化、数据优化、算法开发等工作,并通过SDK与API接口,扩展支持各类学科与行业场景,为各领域科学家与工程师提供优质、可靠的科学计算环境。北太天元V2.5(Windows版本)现已上线,绘图功能重磅升级,内置函数、工具箱丰富更新,让您感受多方位体验升级。查看下方视频可“沉浸式”体验功能升级亮点。 戳链接即刻下载免费试用:www.baltamatica.com/download一、绘图功能全新升级1、支持导出、网格线、缩小、放大、平移、旋转、还原视图等功能绘图窗口界面已全面更新,工具栏功能进一步完善。可使用鼠标对图形进行导出、增删网格线、缩放、平移、旋转、还原视图等操作。2、支持15种以上绘图类型可绘制二维线图、三维线图、曲面图、散点图、饼图、区域图、条形图、直方图、三维散点图、等高线图、箭头图、气泡图、阶梯图、含误差条的线图、箱线图等。3、支持设置图形属性,添加文本描述、轴标签、标题、图例和颜色栏等可设置线条颜色、线型、标记符号等图形属性,并支持添加图例、标题等,进一步提升绘图美观度与实用性。 可调整线条颜色并增加图例、颜色栏、标题等二、内置函数类型丰富1、基础数学支持基本算术运算、三角函数、特殊函数、线性方程、特征值和奇异值、矩阵分解、矩阵运算、随机数的生成、优化、稀疏矩阵的创建和运算等。2、语言基础北太天元目前支持的数据类型包括:int8/uint8/int16/uint16int32/uint32/int64/uint64double/single/complex/charlogical/string/struct/cell该版本可满足二维矩阵和数组的创建、合并、重构等使用需求,并支持常见数据类型和不同数据类型之间的转换,字符和字符串操作,以及高维矩阵的创建(高维矩阵相关操作正在开发中)。3、编程支持创建、运行、调试脚本,以及创建脚本函数、局部函数、匿名函数等。4、数据导入导出支持导入导出的数据类型包含double,single,int32,int64,logical,char,string,支持导入导出的文件格式包括csv,xlsx,mat,txt等。三、工具箱功能更新1、optimization 优化工具箱提供求解线性规划和混合整数线性规划、二次规划等函数。2、ODE支持常微分方程的初始值问题求解器,提供非刚性求解器、刚性求解器。3、fft 快速傅里叶变换提供一维二维的快速傅里叶变换、快速傅里叶逆变换等函数。4、spline 曲线拟合工具箱提供线性与非线性回归、插值、平滑化、后处理拟合等函数。5、computational_geometry 计算几何提供计算几何相关的数据结构和算法,如三角剖分、Voronoi图、多边形、多面体等函数。更多详细功能更新介绍可查看北太天元软件baltamatica_2.5.1 更新日志一、软件使用如您需学习使用北太天元,您可下载产品白皮书、用户手册等文档资料,或通过观看课程视频进一步了解软件操作。详细资料可通过【必看】北太天元软件新手指南查找。二、反馈与交流您的使用与建议是北太天元前进的重要动力,诚邀您反馈软件使用体验(如安装情况、响应时间、稳定性等),我们将第一时间回复您的问题与需求。欢迎大家在社区多多发帖讨论。
(文章灵感来自卢朓老师的B站视频)最近电视剧《三体》的大热,引起了大家对三体系统的注意力,今天就让我们在北太天元上面模拟一下三体系统的运动轨迹首先,什么是三体系统呢?
三体(three-body problem) 天体力学中的基本力学模型。研究三个可视为质点的天体在相互之间万有引力作用下的运动规律问题。 这三个天体的质量、初始位置和初始速度都是任意的。 ----------------------------摘自百度百科简单的说,就是我们需要模拟三个恒星组成的系统的三体运动。详细代码如下,代码摘自互联网
%模拟三个恒星组成的系统的三体运动 clear load_plugin("time"); %为了使用北太天元软件的pause插件函数 close all % 三个恒星的质量都是1 ms = 1 ; mt = 1 ; mj = 1 ; % 无量纲后万有引力常数设置为1 G = 1 ; %初始条件 [xs,ys,xt,yt,xj,yj,vxs,vys,vxt,vyt,vjx,vjt] CI = [0 -0.1 2 2 5 0 0 0 0 0 0 0]; %初始时刻to = 0; %计算终止时刻t f = 120; %由位置的导数速度,速度的导数是加速,牛顿第二定律 % 以及万有引力定律得到常微分方程组 fxy = @(ps, pt, pj,ms,mt,mj) ...G*( mt.*(pt-ps)./norm(pt-ps).^3 ...+ mj.*(pj-ps)./norm(pj-ps).^3 ); F = @(t,Y) [Y(7);Y(8);Y(9);Y(10);Y(11);Y(12);... fxy(Y([1,2]),Y([3,4]),Y([5,6]),ms,mt,mj); ... fxy(Y([3,4]),Y([1,2]),Y([5,6]),mt,ms,mj); ... fxy(Y([5,6]),Y([3,4]),Y([1,2]),mj,mt,ms); ...]; %使用ode45求解常微分方程组的初值问题 [t,Y]=ode45(F,[to,tf],CI); %plot(Y(:,1),Y(:,2),'r',Y(:,3),Y(:,4),'g',Y(:,5),Y(:,6),'b') yo = Y(1) ; dto = 0.3 ; plotmax = 100 ; T=to ; xmin = min(min(Y(:,[1,3,5]))); %三个质点的x坐标(在所有时刻)的最小值 xmax = max(max(Y(:,[1,3,5]))); ymin = min(min(Y(:,[2,4,6]))); %三个质点的y坐标(在所有时刻)的最小值 ymax = max(max(Y(:,[2,4,6]))); clf close all figure('Position',[0 0 1550 800]) hold off told = 0; for i = 1:length(Y(:,1)) dt = abs(Y(i,1)-yo)/abs(Y(i,7)); if dt >= dto if i>plotmax shift = plotmax; else shift = i-1; end plot(... [xmin,xmax],[ymin,ymax], 'w', ... %画一个白色的斜线代替axis([xmin,xmax,ymin,ymax])设置画图范围 Y(i-shift:i,1),Y(i-shift:i,2),'r','LineWidth',2, ... %画第一个恒星在i-shift个时刻和第i个时刻件的轨迹 Y(i,1),Y(i,2),'-or','LineWidth',4, ... %画第一个恒星在第i个时刻所在的位置 Y(i-shift:i,3),Y(i-shift:i,4),'g','LineWidth',2, ... Y(i,3),Y(i,4),'-og','LineWidth',4, ... Y(i-shift:i,5),Y(i-shift:i,6),'b','LineWidth',2, ... Y(i,5),Y(i,6),'-ob','LineWidth',4) title(sprintf('时间=%f',t(i))) T=[T;t(i)]; yo = Y(i,1) ; vo = Y(i,7) ; end pause(0.01) end X=[0:1:length(T)-1]; figure(2) plot(X,T) plot(Y(:,1),Y(:,2),'r', 'LineWidth',2, ... Y(:,3),Y(:,4),'g','LineWidth',2, ... Y(:,5),Y(:,6),'b', 'LineWidth',2) unload_plugin("time")
佳节临近,今天给大家分享一下如何使用北太天元绘制一个灯笼灯笼中有很多大面积的颜色区域,是需要使用北太天元的 fill 函数来完成,fill 函数的帮助如下:
>> help fill 填充的二维多边形 语法: fill(X,Y) 示例: % 函数创建红色多边形。 % X 是顶点的x坐标,Y是顶点的y坐标 % 例如 一个三角形的三个顶点的坐标是p1(0,0), p2(1,0), p3(0.5,0.5) % 画出红色的三角形 x = [0, 1, 0.5]; y = [0, 0, 0.5]; fill(x,y,'r')为了调用 fill 函数,我们需要先创建椭圆数据点生成函数,用来生成椭圆和圆形的边界的 X 和 Y 坐标
% 椭圆数据点生成函数 function [X,Y]=getEllipse(Mu,XR,YR,theta,pntNum) % Mu | 中心点 % XR,YR | 旋转前X,Y半轴长度 % theta | 旋转角度 % pntNum | 生成数据点个数 tList = linspace(0,2*pi,pntNum); X = cos(tList).*XR; Y = sin(tList).*YR; rotateMat = [cos(theta),-sin(theta);sin(theta),cos(theta)]; XY = rotateMat*[X;Y]+Mu(:); X = XY(1,:); Y = XY(2,:); end下面我们就可以开始灯笼的绘制了
clf hold on n = 0.4; x = 1; a = 0.1; w = 2.7;h = 2.5; %灯笼主体椭圆的宽和高 % 绘制灯笼主体 [X0,Y0]=getEllipse([0,0],2.9,h,0,200); fill(X0,Y0,[184,20,25]./255,'EdgeColor',[153,12,40]./255,'LineWidth',1.2) % 绘制辐线 [X,Y]=getEllipse([0,0],w,h,0,200);plot(X,Y,'Color',[236,136,74]./255,'LineWidth',1.2) [X,Y]=getEllipse([0,0],w-n,h,0,200);plot(X,Y,'Color',[236,136,74]./255,'LineWidth',1.2) [X,Y]=getEllipse([0,0],w-2*n,h,0,200);plot(X,Y,'Color',[236,136,74]./255,'LineWidth',1.2) [X,Y]=getEllipse([0,0],w-3*n,h,0,200);plot(X,Y,'Color',[236,136,74]./255,'LineWidth',1.2) [X,Y]=getEllipse([0,0],w-4*n+0.05,h,0,200);plot(X,Y,'Color',[236,136,74]./255,'LineWidth',1.2) [X,Y]=getEllipse([0,0],w-5*n+0.1,h,0,200);plot(X,Y,'Color',[236,136,74]./255,'LineWidth',1.2) [X,Y]=getEllipse([0,0],w-6*n+0.1,h,0,200);plot(X,Y,'Color',[236,136,74]./255,'LineWidth',1.2) plot([0,0],[-h,h],'Color',[236,136,74]./255,'LineWidth',1.2) % 计算其它部件需要的边界坐标 X1 = X0(abs(X0)<=x); X2 = X1(1:size(X1,2)/2); X3 = X1(size(X1,2)/2+1:end); Y1 = Y0(abs(X0)<=x); Y2 = Y1(1:size(Y1,2)/2); Y3 = Y1(size(Y1,2)/2+1:end); XX1 = X0(abs(X0)<=a); XX2 = XX1(1:size(XX1,2)/2); XX3 = XX1(size(XX1,2)/2+1:end); YY1 = ones(1,size(XX2,2)).*(-w-0.2); YY2 = ones(1,size(XX2,2)).*(-h-2.5); YY3 = ones(1,size(XX2,2)).*(-h-2); % 绘制其它部分 Y4 = ones(1,size(Y2,2)).*(w+0.2); fill(X1,[Y2,Y4],[76,24,38]./255,'EdgeColor',[236,136,74]./255,'LineWidth',1.2) Y5 = ones(1,size(Y2,2)).*-(w+0.2); fill(X1,[Y3,Y5],[76,24,38]./255,'EdgeColor',[236,136,74]./255,'LineWidth',1.2) fill(XX1,[YY1,YY3],[76,24,38]./255,'EdgeColor',[236,136,74]./255,'LineWidth',1.2) fill(XX1.+0.7,[YY1,YY3],[76,24,38]./255,'EdgeColor',[236,136,74]./255,'LineWidth',1.2) fill(XX1.-0.7,[YY1,YY3],[76,24,38]./255,'EdgeColor',[236,136,74]./255,'LineWidth',1.2) fill(XX1.+0.35,[YY1,YY3],[76,24,38]./255,'EdgeColor',[236,136,74]./255,'LineWidth',1.2) fill(XX1.-0.35,[YY1,YY3],[76,24,38]./255,'EdgeColor',[236,136,74]./255,'LineWidth',1.2) fill(XX1,[-YY1,-YY2],[76,24,38]./255,'EdgeColor',[236,136,74]./255,'LineWidth',1.2) [X6,Y6]=getEllipse([0,h+1],0.2,0.2,0,200); fill(X6,Y6,[184,20,25]./255,'EdgeColor') % 调整坐标轴 axis([-5 5 -5 5]) hold off title("新春快乐!")