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