# 繪製等位線的方法:Gnuplot > 作者:王一哲 > 日期:2018/3/17 <br /> ## 前言 這是之前測試成功,用 Gnuplot 畫出等位線的方法,雖然可以做出我想要的效果,但是我不太確定其中部分指令的功能,還需要再多測試一下。 目前試過兩種作法: 1. 用 Gnuplot 指令計算每個位置的電位並畫圖 2. 用 C 語言寫一支小程式計算每個位置的電位,將資料存成文字檔,再用 Gnuplot 讀取文字檔的資料畫圖 <br /> <img style="display: block; margin-left: auto; margin-right: auto" height="80%" width="80%" src="https://lh5.googleusercontent.com/-_EVk0pwcoPj_wUx25PGTQDeEGL84S7PoQjcPbs8DQp-VNgxiyBs83T2pWBBhq6JJ1TTlXc-mKaDuxmtlz80QozXQq70kzCBYDP4wwxTXes7JWlcvFjbX0gJYqIo_VqweCTAROiX"> <div style="text-align:center">方法1成果</div> <br /> <img style="display: block; margin-left: auto; margin-right: auto" height="80%" width="80%" src="https://lh3.googleusercontent.com/3zJriK8k7BMdgEtyMn1XDLBazooUG_2k_jaM0CsT_dbkLeu7J5cq3IW2QttZxBdPwqTRREnA29-2wwWPtScCP7j96JS72QVE6iIsaHVMyo1GS6L_tC-4rw8jlBFWiRCZMNyjxRKl"> <div style="text-align:center">方法2成果</div> <br /> 使用版本為 Gnuplot 5.2 patchlevel 2,下載頁面為 https://sourceforge.net/projects/gnuplot/files/gnuplot/5.2.2/ <br /> ## 方法1:用 Gnuplot 指令 ```gnuplot= reset # 清除所有設定 # 設定輸出格式, wxt: 顯示於視窗, png: 存成 png 圖檔 #set terminal wxt set terminal png size 600,450 set output "electric_potential.png" # 設定靜電力常數, 點電荷電量及位置 k = 8.988E9 x1 = -0.1 y1 = 0 q1 = 1E-8 x2 = 0.1 y2 = 0 q2 = -1E-8 # 設定計算距離r, 電位V的函式 r(x,y) = sqrt(x*x+y*y) V1(x,y)= k*q1/r(x-x1,y-y1) V2(x,y)= k*q2/r(x-x2,y-y2) V(x,y) = V1(x,y)+V2(x,y) # 設定x, y軸繪圖範圍 set xrange [-0.2:0.2] set yrange [-0.1:0.1] # 設定x,y取點數 set isosamples 80,80 # 設定座標軸標籤, 為了使z軸標籤不會和數字重疊, 加上 offset 移動位置 set xlabel "x(m)" set ylabel "y(m)" set zlabel "V(volt)" offset -2 set grid # 設定底部的格線 set pm3d # 著色 set hidden3d # 隱藏3d曲線上的線條 # 設定數值對應的顏色, rainbow (blue-green-yellow-red) set palette rgb 33,13,10 #set view map # 由正上方向下看 #set contour base # 於底部畫出等高線 #set cntrparam levels 20 # 等高線數量為20 splot V(x,y) ``` <br /> 將以上的文字複製、貼上到文字編輯器中,存成 **electric_potential_data_plot.plt**,開啟 Gnuplot,切換到存於這個檔案的資料夾,輸入並執行 ```shell load 'electric_potential_data_plot.plt' ``` 這個方法的好處在於只要用到 Gnuplot,不需要用到其它的軟體。 <br /> ## 方法2:用 Gnuplot 讀取資料檔 ```gnuplot= reset # 清除所有設定 # 設定輸出格式, wxt: 顯示於視窗, png: 存成 png 圖檔 #set terminal wxt set terminal png size 600,450 set output "electric_potential_data_plot.png" # 設定座標軸標籤, 為了使z軸標籤不會和數字重疊, 加上 offset 移動位置 set xlabel "x(m)" set ylabel "y(m)" set zlabel "V(volt)" offset -2 set grid # 設定底部的格線 set pm3d # 著色 set hidden3d # 隱藏3d曲線上的線條 set dgrid3d 100,100 qnorm 3 # 將讀取的資料切為100*100格並使數值平滑 # 設定數值對應的顏色, rainbow (blue-green-yellow-red) set palette rgb 33,13,10 #set view map # 由正上方向下看 #set contour base # 於底部畫出等高線 #set cntrparam levels 20 # 等高線數量為20 # 讀取資料檔, 使用1, 2, 3欄資料作為x, y, z數值, 將數值連線 splot "electric_potential_data.txt" using 1:2:3 with lines ``` <br /> 這是用來產生資料的程式 ```c= /* 產生繪製等電位線用的數值資料 作者: 王一哲 Yi-Zhe Wang 日期: 2018/3/13 */ #include <stdio.h> #include <math.h> #include <stdlib.h> // 定義計算電位的運算式 double potential(double x, double y, double q1, double x1, double y1, double q2, double x2, double y2) { double k = 8.988*pow(10, 9); return k*(q1/sqrt(pow((x-x1), 2) + pow((y-y1), 2)) + q2/sqrt(pow((x-x2), 2) + pow((y-y2), 2))); } int main(void){ //定義繪圖範圍及分割數量 double xmin, xmax, dx, ymin, ymax, dy, num; xmin = -2.0; xmax = +2.0; ymin = -2.0; ymax = +2.0; num = 100.0; dx = (xmax - xmin) / num; dy = (ymax - ymin) / num; //定義點電荷電量及位置 double q1, x1, y1, q2, x2, y2; q1 = +2.0*pow(10, -8); x1 = -1.0; y1 = 0.0; q2 = -1.0*pow(10, -8); x2 = +1.0; y2 = 0.0; //建立計算結果的輸出檔案, 寫入欄位標題 FILE *fPtr; fPtr = fopen("electric_potential_data.txt", "w"); if (!fPtr){ printf("檔案建立失敗\n"); exit(1); } else { fprintf(fPtr, "x(m) \t y(m) \t V(volt) \n"); } //自動改變(x, y)計算電位並寫入輸出檔 int i, j; double x, y, result; for(i = 0; i <= (int)num; i++) { for(j = 0; j <= (int)num; j++) { x = xmin + dx*(double)i; y = ymin + dy*(double)j; if((x!=x1 && y!=y1) || (x!=x2 && y!=y2)) { result = potential(x, y, q1, x1, y1, q2, x2, y2); fprintf(fPtr, "%f \t %f \t %f \n", x, y, result); } } } fclose(fPtr); return 0; } ``` <br /> 資料檔名稱為 [electric_potential_data.txt](https://drive.google.com/file/d/1znW-iIXoZekh1OSrCrz_DUWCH-TshJ5k/view),格式如下 ```shell x(m) y(m) V(volt) -2.000000 -2.000000 55.462889 -2.000000 -1.960000 56.614089 -2.000000 -1.920000 57.802880 -2.000000 -1.880000 59.030634 -2.000000 -1.840000 60.298756 -2.000000 -1.800000 61.608685 -2.000000 -1.760000 62.961885 ``` <br /> 如果學會這個方法,以後就可以用指令將大量的數據丟進 Gnuplot 畫圖,也是有好處的。 <br /> ## 結語 實在是太久沒用 Gnuplot,指令都快忘光了,正好複習一下。以後如果需要畫類似的圖,就可以拿這個檔案去修改,速度會快很多。 --- ###### tags:`軟體`、`gnuplot`