高斯庫 Arduino
Ivan Seidel 編寫的 Gaussian 庫幫助您在 Arduino 中實現高斯數學、卡爾曼濾波器和移動平均值。
要下載此庫,請轉到**庫管理器**並搜尋**“Gaussian”**。安裝 Ivan Seidel 編寫的庫。

安裝完成後,轉到:**檔案 → 示例 → Gaussian**,然後開啟 GaussianRandomPlot 示例。
示例
現在,這個示例乍一看可能讓人不知所措。因此,我建議您首先在 Arduino 上執行此示例,並檢視序列埠監視器的輸出。我將在這裡展示它。

總而言之,此程式碼生成 20,000 個高斯隨機數(即這些數字遵循高斯鐘形曲線分佈),並根據它們與平均值的距離將其分成不同的列或塔(稱為命中)。然後繪製這些命中,圖表顯示分佈確實是高斯分佈。
程式碼詳解
讓我們開始程式碼詳解。
我們從包含庫開始。
#include <Gaussian.h>
在 setup 中,我們只需初始化序列埠,併為隨機數生成器新增一個種子。
void setup() {
Serial.begin(9600);
Serial.println("
Starting Random Gaussian Distribuition...");
delay(20);
randomSeed(analogRead(0));
}然後我們定義幾個常量。SIZE 表示我們將擁有的條形圖數量。TESTS 表示我們將生成的隨機數數量。**BAR_SIZE** 表示每個條形圖的最大尺寸或高度(**= 字元的數量**)。
// The number of "slots" to record the hits of gaussian random #define SIZE 36 // How many tests will be performed #define TESTS 20000 // How many characters will have, in width? #define BAR_SIZE 40
在迴圈中,我們首先建立一個高斯物件,平均值為 0,方差為 10。
現在,這個平均值將參考繪製時的中心條形。因此,定義了“零”值(高斯峰值所在的位置)。由於我們有 36 個條形圖,平均值為 0,因此峰值將在第 18 個條形圖處。
然後我們建立一個大小等於條形圖數量的 hits 陣列,並將其初始化為 0。此陣列最終將儲存有多少隨機點位於每個條形圖中。
void loop() {
Gaussian g1 = Gaussian(0, 10);
long zero = SIZE/2 - g1.mean;
long hits[SIZE] = {0};
// Zero the array
for(int i = 0; i < SIZE; i++)
hits[i] = 0;稍後,將進行一些序列埠監視器列印,從 0 到 100% 的行。
// Print Header (0% ------------- 100%)
Serial.print("0% ");
for(int i = 3; i < BAR_SIZE - 5; i++)
Serial.print("-");
Serial.println(" 100%");接下來,執行到測試次數的 for 迴圈。for 迴圈的第一部分很簡單,只需在 0 ---- 100% 行下方列印 ======== 行。重要部分是後半部分。使用 **g1.random()** 生成高斯隨機數。根據其值,確定其位置(即它將位於哪個條形圖中)(**int place = (int)round(val - g1.mean + zero);**)。然後將位置限制在 0 和 36 之間,即小於 0 的條目將向上拉到 0,大於 36 的條目將向下推到 36。最後,該位置的 hits 陣列的值遞增,表示生成的隨機值最終分配給了該條形圖。
// Process the gaussians and randomize 'TESTS' times
int lastStep = 0, step;
Serial.print("=");
for(int i = 0; i < TESTS; i++){
step = (double)i/TESTS*BAR_SIZE;
if(step > lastStep){
while(lastStep < step){
Serial.print("=");
lastStep++;
}
}
double val = g1.random();
int place = (int)round(val - g1.mean + zero);
place = constrain(place, 0, SIZE);
hits[place]++;
}
Serial.print(" END!
");之後,計算 **maxHit**,即包含最多點的條形圖。由於條形圖的最大大小為 **BAR_SIZE (40)**,因此確定一個比例因子,以便 **maxHit** 條形圖的大小為 40,其他所有條形圖都相應縮放。列印 **maxHit** 和 scale 的值。
// Just to scale the plot on the Serial, to improve visualization
long maxHit = 0;
for(int i = 0; i < SIZE; i++){
maxHit = max(maxHit, hits[i]);
// Uncomment this line if you want to see the NUMBER of hits
// Serial.println(hits[i]);
}
// This will print the bar graphic
double scale = (double)maxHit/BAR_SIZE;
Serial.print("Scale: ");
Serial.print(scale);
Serial.print("\tMaxHit: ");
Serial.println(maxHit);其餘程式碼與在序列埠監視器上繪製值有關。
for(int i = 1; i < SIZE - 1; i++){
int len = hits[i]/scale;
for(int x = 0; x < len; x++)
Serial.print("=");
Serial.print("
");
}
// Wait until dinosaurs come back on earth
while(1);
}因此,此程式碼實質上表明使用 **g1.random()** 生成的隨機數遵循隨機分佈。
您可以檢視此庫的 GitHub 倉庫自述檔案,以瞭解此庫中可用的其他函式。
資料結構
網路
關係資料庫管理系統 (RDBMS)
作業系統
Java
iOS
HTML
CSS
Android
Python
C語言程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP