首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

均值不等式視覺化探究:冪平均數單調性的 Win32 GUI 實驗

     編輯:關於C語言

數學背景

對正數數列 q₁, q₂, ..., qₙ,定義 冪平均數(廣義平均數):

Mₓ = ( (q₁ˣ + q₂ˣ + ... + qₙˣ) / n )^(1/x) (x ≠ 0)

M₀ = (q₁ q₂ ... qₙ)^(1/n) (幾何平均數,x→0 極限)

均值不等式指出:x < y ⟹ Mₓ ≤ Mᵧ,等號僅當所有 qᵢ 相等時成立。特例:

  • M₋₁:調和平均數
  • M₀:幾何平均數
  • M₁:算術平均數
  • M₂:平方平均數(RMS)

當 x → -∞ 趨近最小值,x → +∞ 趨近最大值。

實驗程式:Win32 繪圖視覺化

程式隨機生成 1000 個 [100, 400) 區間整數,計算 x ∈ [-100, 100] 時的 Mₓ 並繪製曲線,同時標示最大值與最小值水平線。

核心繪圖邏輯


void draw(HDC hdc) {
    const int N = 1000;
    double q[N];
    srand((unsigned)time(0));
    for (int i = 0; i < N; i++) q[i] = rand() % 300 + 100;

    double maxv = q[0], minv = q[0];
    for (int i = 1; i < N; i++) {
        if (q[i] > maxv) maxv = q[i];
        if (q[i] < minv) minv = q[i];
    }
    // 畫最大/最小值參考線
    MoveToEx(hdc, -400+450, (int)-maxv+600, 0); LineTo(hdc, 400+450, (int)-maxv+600);
    MoveToEx(hdc, -400+450, (int)-minv+600, 0); LineTo(hdc, 400+450, (int)-minv+600);

    // x < 0
    for (int i = -100; i < 0; i++) {
        double sum = 0;
        for (int j = 0; j < N; j++) sum += pow(q[j], i);
        double y = pow(sum / N, 1.0 / i);
        Ellipse(hdc, i*4+450-2, (int)-y+600-2, i*4+450+2, (int)-y+600+2);
    }
    // x = 0 (幾何平均數)
    double y = 1;
    for (int i = 0; i < N; i++) y *= pow(q[i], 1.0/N);
    Ellipse(hdc, 450-4, (int)-y+600-4, 450+4, (int)-y+600+4);
    // x > 0
    for (int i = 1; i < 100; i++) {
        double sum = 0;
        for (int j = 0; j < N; j++) sum += pow(q[j], i);
        double y = pow(sum / N, 1.0 / i);
        Ellipse(hdc, i*4+450-2, (int)-y+600-2, i*4+450+2, (int)-y+600+2);
    }
}

觀察結果

冪平均數曲線示意圖 1 冪平均數曲線示意圖 2

  • 曲線嚴格單調遞增,驗證均值不等式
  • x=0 處平滑過渡為幾何平均數
  • 兩端分別漸近最小值與最大值水平線
  • 隨機數分布越分散,曲線彎曲越明顯

擴展思考

  • 加權冪平均數:Mₓ = (Σ wᵢ qᵢˣ)^(1/x),Σ wᵢ = 1
  • Jensen 不等式為其理論基石(凸函數性質)
  • 資訊論中 x→0 對應熵、x=1 對應期望值
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved