因?yàn)槲沂菙?shù)學(xué)專(zhuān)業(yè)的,想知道北太天元軟件用于優(yōu)化方向的算法支撐程度怎樣?想必很多科研工作者都需要這方面的支撐,各個(gè)專(zhuān)業(yè)需求不同,比如:工具箱、仿真、算法等。
數(shù)據(jù)可視化(Data Visualization)是關(guān)于數(shù)據(jù)視覺(jué)表現(xiàn)形式的科學(xué)技術(shù)研究,指利用計(jì)算機(jī)圖形學(xué)和圖像處理技術(shù),將數(shù)據(jù)轉(zhuǎn)換為圖形或圖像在屏幕上顯示出來(lái),成為對(duì)人類(lèi)視覺(jué)更為友好的圖形圖像的過(guò)程。
本文使用的北太天元版本為 Baltamatica 2.1.3.2 Windows版
1. 首先需要確保北太天元已經(jīng)加載了 繪圖插件 graph, 可以在 幫助 》 插件 中查看,軟件安裝完成后會(huì)默認(rèn)加載繪圖插件。
2. 在繪圖插件加載后,如何查看繪圖插件提供哪些函數(shù)呢?有兩個(gè)方法,一個(gè)是直接在命令行窗口輸入 plugin_help(‘graph’) 就可以查看目前繪圖插件提供的全部函數(shù),或者在命令行窗口輸入 help , 這個(gè)命令會(huì)返回北太天元里提供的所有內(nèi)核提供的命令、腳本提供的命令和 插件 [graph(已授權(quán))] 提供的命令。
如下圖所示
3. 如何查看某個(gè)繪圖函數(shù)的具體用法呢?
在命令行窗口直接輸入 help 函數(shù)名,例如help plot3
使用 plot3 繪制三維螺旋線(xiàn)。
t=0:pi/50:10*pi;
plot3(sin(t),cos(t),t);
axis square;
以上代碼運(yùn)行的結(jié)果如下圖所示。
特殊二維圖形
1. 條形圖
bar(X,Y):X是坐標(biāo),Y是高度,條形的跨度是x坐標(biāo)的最小間距
bar(Y):對(duì)Y繪制條形圖。如果Y為矩陣,Y的每一行聚集在一起。橫
2. 區(qū)域圖
區(qū)域圖用于顯示向量或者矩陣中的元素在對(duì)應(yīng)的x下,在所有元素中所占的比例。默認(rèn)情況下,函數(shù)area將矩陣中各行的元素集中,將這些值繪成曲線(xiàn),并填充曲線(xiàn)和x軸之間的空間。其調(diào)用語(yǔ)法如下。
area(Y):繪制向量Y。
area(X,Y):繪制 Y 中的值對(duì) x 坐標(biāo) X 的圖。然后,該函數(shù)根據(jù) Y 的形狀填充曲線(xiàn)之間的區(qū)域:如果 Y 是向量,則該圖包含一條曲線(xiàn)。area 填充該曲線(xiàn)和水平軸之間的區(qū)域。如果 Y 是矩陣,則該圖對(duì) Y 中的每列都包含一條曲線(xiàn)。area 填充這些曲線(xiàn)之間的區(qū)域并堆疊它們,從而顯示在每個(gè) x 坐標(biāo)處每個(gè)行元素在總高度中的相對(duì)量。
3. 餅形圖
在統(tǒng)計(jì)學(xué)中,經(jīng)常要使用餅形圖來(lái)表示各個(gè)統(tǒng)計(jì)量占總量的份額,餅形圖可以顯示向量或矩陣中的元素占總體的百分比。在北太天元中可以使用pie函數(shù)來(lái)繪制二維餅形圖,其調(diào)用語(yǔ)法如下。
pie(X):使用 X 中的數(shù)據(jù)繪制餅圖。餅圖的每個(gè)扇區(qū)代表 X 中的一個(gè)元素。如果 sum(X) ≤ 1,X 中的值直接指定餅圖扇區(qū)的面積。如果 sum(X) < 1,pie 僅繪制部分餅圖。如果 sum(X) > 1,則 pie 通過(guò) X/sum(X) 對(duì)值進(jìn)行歸一化,以確定餅圖的每個(gè)扇區(qū)的面積。
4. 直方圖
直方圖用于直觀地顯示數(shù)據(jù)的分布情況。在北太天元中提供了兩個(gè)函數(shù)用于直方圖的繪制:hist和polarhistogram。hist主要是用于直角坐標(biāo)系直方圖的繪制;polarhistogram主要用于極坐標(biāo)系下直方圖的繪制。下文主要介紹hist函數(shù)的用法。hist函數(shù)的調(diào)用語(yǔ)法如下。
n=hist(Y):繪制Y的直方圖。
n=hist(Y,nbins):指定分格的數(shù)目。
5. 針狀圖
在北太天元中,可以使用函數(shù)stem生成二維離散圖形。stem函數(shù)調(diào)用語(yǔ)法如下:
stem(Y):繪制Y的數(shù)據(jù)序列,圖形起始于X軸,并在每個(gè)數(shù)據(jù)點(diǎn)處繪制一個(gè)小圓圈。
strm(X,Y):按照指定的X繪制數(shù)據(jù)序列Y。
6. 方向矢量圖和速度矢量圖
在北太天元中可以繪制方向矢量圖和速度矢量圖。quiver函數(shù)用來(lái)繪制箭狀圖或者速度矢量圖,其調(diào)用語(yǔ)法如下。
quiver(x,y,u,v):繪制矢量圖,參數(shù)x和y用于指定矢量的位置,u和v用于指定要繪制的矢量。
quiver(u,v):繪制矢量圖,矢量的位置為默認(rèn)值。
梯度方向也就是速度方向,本例使用quiver函數(shù)即可達(dá)到目的。
7. 等高線(xiàn)的繪制
等高線(xiàn)用于創(chuàng)建、顯示并標(biāo)注由一個(gè)或多個(gè)矩陣確定的等值線(xiàn)。北太天元中提供有一些函數(shù)用于繪制等高線(xiàn):
contour 顯示矩陣Z的二維等高線(xiàn)圖
meshc 創(chuàng)建一個(gè)匹配有二維等高線(xiàn)圖的網(wǎng)格圖
contourf 顯示矩陣Z的二維等高線(xiàn)圖,并在各等高線(xiàn)之間用實(shí)體顏色填充
surfc 創(chuàng)建一個(gè)匹配有二維等高線(xiàn)圖的曲面圖
這里只介紹最常用的函數(shù)contour,其他函數(shù)請(qǐng)讀者自行查閱幫助文檔。contour函數(shù)用于繪制二維等高線(xiàn)圖,其調(diào)用語(yǔ)法如下。
contour(Z):繪制矩陣Z的等高線(xiàn),繪制時(shí)將Z在x-y平面插值,等高線(xiàn)數(shù)量和數(shù)值由系統(tǒng)根據(jù)Z自動(dòng)確定。
contour(X,Y,Z):繪制矩陣Z的等高線(xiàn),坐標(biāo)值由矩陣X和Y指定,矩陣X、Y、Z的維數(shù)必須相同。
contour(X,Y,Z,“ShowText”,“on”):繪制矩陣Z的等高線(xiàn),坐標(biāo)值由矩陣X和Y指定三維圖形,通過(guò)ShowText后的參數(shù)為“on”或者“off”,設(shè)置圖像是否顯示標(biāo)注。
除了繪制二維圖形,北太天元還提供一系列三維圖形繪制函數(shù),下文將對(duì)這些函數(shù)進(jìn)行詳細(xì)說(shuō)明。
繪制三維曲線(xiàn)圖
在北太天元中,plot3函數(shù)用于繪制三維曲線(xiàn)圖。該函數(shù)的用法和plot類(lèi)似,其調(diào)用語(yǔ)法如下。
plot3(X,Y,Z): 繪制三維空間中的坐標(biāo)。要繪制由線(xiàn)段連接的一組坐標(biāo),請(qǐng)將 X、Y、Z 指定為相同長(zhǎng)度的向量。要在同一組坐標(biāo)軸上繪制多組坐標(biāo),請(qǐng)將 X、Y 或 Z 中的至少一個(gè)指定為矩陣,其他指定為向量。
plot3(X,Y,Z,LineSpec): 使用指定的線(xiàn)型、標(biāo)記和顏色創(chuàng)建繪圖。
plot3(X1,Y1,Z1,...,Xn,Yn,Zn): 在同一組坐標(biāo)軸上繪制多組坐標(biāo)。使用此語(yǔ)法作為將多組坐標(biāo)指定為矩陣的替代方法。
plot3(X1,Y1,Z1,LineSpec1,...,Xn,Yn,Zn,LineSpecn): 可為每個(gè) XYZ 三元組指定特定的線(xiàn)型、標(biāo)記和顏色。您可以對(duì)某些三元組指定 LineSpec,而對(duì)其他三元組省略它。
plot3(...,Name,Value): 使用一個(gè)或多個(gè)名稱(chēng)-值對(duì)組參數(shù)指定 Line 屬性。
繪制三維曲面圖
在北太天元中,除了plot3函數(shù)可用于繪制三維圖形外,還有一些函數(shù)可以用來(lái)繪制三維網(wǎng)格圖和曲面圖。下面分別介紹這些函數(shù)。
1. 三維網(wǎng)格圖
mesh函數(shù)用于繪制三維網(wǎng)格圖,其調(diào)用語(yǔ)法如下。
mesh(X,Y,Z): 創(chuàng)建一個(gè)網(wǎng)格圖,該網(wǎng)格圖為三維曲面,有實(shí)色邊顏色,無(wú)面顏色。該函數(shù)將矩陣 Z 中的值繪制為由 X 和 Y 定義的 x-y 平面中的網(wǎng)格上方的高度。邊顏色因 Z 指定的高度而異。
mesh(Z): 創(chuàng)建一個(gè)網(wǎng)格圖,并將 Z 中元素的列索引和行索引用作 x 坐標(biāo)和 y坐標(biāo)。
mesh(Z,C): 進(jìn)一步指定邊的顏色。
mesh(___,C): 進(jìn)一步指定邊的顏色。
mesh(ax,___): 將圖形繪制到 ax 指定的坐標(biāo)區(qū)中,而不是當(dāng)前坐標(biāo)區(qū)中。指定坐標(biāo)區(qū)作為第一個(gè)輸入?yún)?shù)。
mesh(___,Name,Value): 使用一個(gè)或多個(gè)名稱(chēng)-值對(duì)組參數(shù)指定曲面屬性。例如,'FaceAlpha',0.5 創(chuàng)建半透明網(wǎng)格圖。
2. 三維曲面圖
函數(shù)surf用來(lái)繪制三維表面圖形,其調(diào)用語(yǔ)法如下。
surf(X,Y,Z) 創(chuàng)建一個(gè)三維曲面圖,它是一個(gè)具有實(shí)色邊和實(shí)色面的三維曲面。該函數(shù)將矩陣 Z 中的值繪制為由 X 和 Y 定義的 x-y 平面中的網(wǎng)格上方的高度。曲面的顏色根據(jù) Z 指定的高度而變化。
surf(Z) 創(chuàng)建一個(gè)曲面圖,并將 Z 中元素的列索引和行索引用作 x 坐標(biāo)和 y 坐標(biāo)。
燈籠中有很多大面積的顏色區(qū)域,是需要使用北太天元的 fill 函數(shù)來(lái)完成,fill 函數(shù)的幫助如下:
>> help fill 填充的二維多邊形 語(yǔ)法: fill(X,Y) 示例: % 函數(shù)創(chuàng)建紅色多邊形。 % X 是頂點(diǎn)的x坐標(biāo),Y是頂點(diǎn)的y坐標(biāo) % 例如 一個(gè)三角形的三個(gè)頂點(diǎn)的坐標(biāo)是p1(0,0), p2(1,0), p3(0.5,0.5) % 畫(huà)出紅色的三角形 x = [0, 1, 0.5]; y = [0, 0, 0.5]; fill(x,y,'r')
為了調(diào)用 fill 函數(shù),我們需要先創(chuàng)建橢圓數(shù)據(jù)點(diǎn)生成函數(shù),用來(lái)生成橢圓和圓形的邊界的 X 和 Y 坐標(biāo)
% 橢圓數(shù)據(jù)點(diǎn)生成函數(shù) function [X,Y]=getEllipse(Mu,XR,YR,theta,pntNum) % Mu | 中心點(diǎn) % XR,YR | 旋轉(zhuǎn)前X,Y半軸長(zhǎng)度 % theta | 旋轉(zhuǎn)角度 % pntNum | 生成數(shù)據(jù)點(diǎn)個(gè)數(shù) 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
下面我們就可以開(kāi)始燈籠的繪制了
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) % 繪制輻線(xiàn) [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) % 計(jì)算其它部件需要的邊界坐標(biāo) 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') % 調(diào)整坐標(biāo)軸 axis([-5 5 -5 5]) hold off title("新春快樂(lè)!")
(文章靈感來(lái)自盧朓老師的B站視頻)
最近電視劇《三體》的大熱,引起了大家對(duì)三體系統(tǒng)的注意力,今天就讓我們?cè)诒碧煸厦婺M一下三體系統(tǒng)的運(yùn)動(dòng)軌跡
首先,什么是三體系統(tǒng)呢?
三體(three-body problem) 天體力學(xué)中的基本力學(xué)模型。研究三個(gè)可視為質(zhì)點(diǎn)的天體在相互之間萬(wàn)有引力作用下的運(yùn)動(dòng)規(guī)律問(wèn)題。 這三個(gè)天體的質(zhì)量、初始位置和初始速度都是任意的。 ----------------------------摘自百度百科
簡(jiǎn)單的說(shuō),就是我們需要模擬三個(gè)恒星組成的系統(tǒng)的三體運(yùn)動(dòng)。
詳細(xì)代碼如下,代碼摘自互聯(lián)網(wǎng)
%模擬三個(gè)恒星組成的系統(tǒng)的三體運(yùn)動(dòng) clear load_plugin("time"); %為了使用北太天元軟件的pause插件函數(shù) close all % 三個(gè)恒星的質(zhì)量都是1 ms = 1 ; mt = 1 ; mj = 1 ; % 無(wú)量綱后萬(wàn)有引力常數(shù)設(shè)置為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]; %初始時(shí)刻to = 0; %計(jì)算終止時(shí)刻t f = 120; %由位置的導(dǎo)數(shù)速度,速度的導(dǎo)數(shù)是加速,牛頓第二定律 % 以及萬(wàn)有引力定律得到常微分方程組 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求解常微分方程組的初值問(wèn)題 [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]))); %三個(gè)質(zhì)點(diǎn)的x坐標(biāo)(在所有時(shí)刻)的最小值 xmax = max(max(Y(:,[1,3,5]))); ymin = min(min(Y(:,[2,4,6]))); %三個(gè)質(zhì)點(diǎn)的y坐標(biāo)(在所有時(shí)刻)的最小值 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', ... %畫(huà)一個(gè)白色的斜線(xiàn)代替axis([xmin,xmax,ymin,ymax])設(shè)置畫(huà)圖范圍 Y(i-shift:i,1),Y(i-shift:i,2),'r','LineWidth',2, ... %畫(huà)第一個(gè)恒星在i-shift個(gè)時(shí)刻和第i個(gè)時(shí)刻件的軌跡 Y(i,1),Y(i,2),'-or','LineWidth',4, ... %畫(huà)第一個(gè)恒星在第i個(gè)時(shí)刻所在的位置 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('時(shí)間=%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")
1. Windows下MSYS2 開(kāi)發(fā)環(huán)境的地址:打包好的MSYS2的百度云地址
2. SDK相關(guān)開(kāi)發(fā)教程和視頻: 開(kāi)發(fā)示例文檔 , 開(kāi)發(fā)教程視頻
將下載的sdk文件放到 include 目錄下
將需要開(kāi)發(fā)的 cpp 文件放在 src 下面。
myproject: - include - bin - include - lib - src - main.cpp - *.cpp - CMakeLists.txt
cmake_minimum_required(VERSION 3.10) project(main VERSION 1.0.0) # 將所有 .cpp 文件列出來(lái) file(GLOB PLUGIN_SOURCE src/*.cpp) # add_library 表示增加一個(gè)庫(kù)文件目標(biāo) # 由于是使用 dlopen() 載入,需要是 MODULE 類(lèi)型 add_library(${PROJECT_NAME} MODULE ${PLUGIN_SOURCE}) # 插件的文件名總是 main set_target_properties(${PROJECT_NAME} PROPERTIES OUTPUT_NAME "main") # module 類(lèi)型的庫(kù)不需要 lib 前綴 set_target_properties(${PROJECT_NAME} PROPERTIES PREFIX "") # 鏈接 bex add_library(bex SHARED IMPORTED) set_target_properties(bex PROPERTIES INTERFACE_INCLUDE_DIRECTORIES ${PROJECT_SOURCE_DIR}/include/include) set_target_properties(bex PROPERTIES IMPORTED_LOCATION ${PROJECT_SOURCE_DIR}/include/bin/libbex.dll) set_target_properties(bex PROPERTIES IMPORTED_IMPLIB ${PROJECT_SOURCE_DIR}/include/lib/libbex.dll.a) target_link_libraries(${PROJECT_NAME} bex)
打開(kāi) msys2 版的 mingw64 窗口(解壓后 msys64-tmp 目錄下的 mingw64.exe),進(jìn)入到 SDK的開(kāi)發(fā)目錄層后新建一個(gè) build 目錄用于存儲(chǔ)編譯的文件
cd <my_project> mkdir build && cd build
進(jìn)行 configure
cmake .. -G "MinGW Makefiles"
進(jìn)行編譯
為了方便可以設(shè)置一下 bash alias,將mingw32-make命名為make
nano ~/.bashrc
在最后一行添加:
alias make='mingw32-make'
重新加載bash信息
. ~/.bashrc
進(jìn)行編譯:
make -jN # N 表示開(kāi)啟的線(xiàn)程數(shù)
編譯結(jié)束后會(huì)看到 main.dll
在北太天元的安裝目錄下的 plugins 文件夾下 新建一個(gè)文件夾,名字為 你開(kāi)發(fā)插件的名字,例如 myplugin
然后在北太天元的
幫助 -> 插件
加載
---------------------------------------------------------------
示例中用到的所有文件附件: