基於最小二乘法的太陽黑子活動模型引數辨識和預測matlab模擬

软件算法开发發表於2024-10-19

1.程式功能描述
基於最小二乘法的太陽黑子活動模型引數辨識和預測matlab模擬。太陽黑子是人們最早發現也是人們最熟悉的一種太陽表面活動。因為太陽內部磁場發生變化,太陽黑子的數量並不是固定的,它會隨著時間的變化而上下波動,每隔一定時間會達到一個最高點,這段時間就被稱之為一個太陽黑子週期。太陽黑子的活動呈現週期性變化是由施瓦貝首次發現的。沃爾夫 (R.Wolfer)繼而推算出11年的週期規律。實際上,太陽黑子的活動不僅呈11年的週期變化,還有海耳在研究太陽黑子磁場分佈時發現的22年週期;格萊斯堡等人發現的80年週期以及蒙德極小期等。由於太陽黑子的活動規律極其複雜,時至今日科學家們仍在努力研究其內在的規律和特性。事實上,對太陽黑子活動規律的研究不僅具有理論意義,而且具有直接的應用需求。太陽黑子的活動呈現週期性變化的,沃爾夫(R.Wolfer)根據在過去的288 年(1700年~1987 年)間每年太陽黑子出現的數量和大小的觀測資料推算出11 年的週期規律。我們利用Matlab強大的資料處理與模擬功能,對Wolfer數進行功率譜密度分析從而可以得到對太陽黑子活動週期的結論。

2.測試軟體版本以及執行結果展示
MATLAB2022a版本執行



3.核心程式

ind = 0;
kk=300;
for k=1:length(SSN)+Predict_Len; %開始求K 
    if k <= length(SSN)
       Y_predict3(k) = c(1,k) + c(2,k)*k + c(3,k)*yc(k) + c(4,k)*ys(k) + c(5,k)*yc2(k) + c(6,k)*ys2(k) + c(7,k)*yc3(k) + c(8,k)*ys3(k); 
    else    
       %Y_predict3(k) = c(1,end) + c(2,end)*k + c(3,end)*yc(k) + c(4,end)*ys(k) + c(5,end)*yc2(k) + c(6,end)*ys2(k) + c(7,end)*yc3(k) + c(8,end)*ys3(k); 
       
       c0 = mean(c(1,end-kk-1:end-kk));
       c1 = mean(c(2,end-kk-1:end-kk));
       c2 = mean(c(3,end-kk-1:end-kk));
       c3 = mean(c(4,end-kk-1:end-kk));
       c4 = mean(c(5,end-kk-1:end-kk));
       c5 = mean(c(6,end-kk-1:end-kk));
       c6 = mean(c(7,end-kk-1:end-kk));
       c7 = mean(c(8,end-kk-1:end-kk));
 
       Y_predict3(k) = c0  + c1*k + c2*yc(k) + c3*ys(k) + c4*yc2(k) + c5*ys2(k) + c6*yc3(k) + c7*ys3(k); 
       ind           = ind + 1;
       Ys(ind)       = Y_predict3(k);
    end
end
figure;
 
plot(YEAR2,SSN,'r');hold off;
legend('預測SSN','實際SSN');
grid on;
 
%根據預測結果得到下次太陽黑子活動高峰和低峰的時間
%前一次高峰日期為
 XX           = 59;
[Vmax1,Imax1] = max(Ys);
[Vmax2,Imax2] = max(SSN(length(SSN)-XX:length(SSN)));%3100~3160
 
if Vmax1 > Vmax2
   II   =  Imax1;
   MM   =  Vmax1; 
   time = (length(SSN) + II-3019);%原資料的最後一個月份+預測後的最大值 - 前一個高峰日期
else
   II   =  Imax2;
   MM   =  Vmax2; 
   time = (length(SSN) + (XX-II)-3019);%原資料的最後一個月份+預測後的最大值 - 前一個高峰日期
end
Years=time/12;
 
fprintf('下次高峰期日期為:%d',round(2000 + Years));
fprintf('年\n\n');
fprintf('最大值為:%2.2f\n\n\n\n',MM);
 
%計算下一次低谷值
[Vmin,Imin] = min(Ys);
fprintf('下次低峰期日期為:%d',round(2012 + Imin/12));
fprintf('年\n\n');
fprintf('最小值為:%2.2f\n\n',Vmin);
16_013m

  

4.本演算法原理
在研究太陽黑子活動時,通常會選擇一個合適的物理或統計模型來描述其週期性變化規律。例如,可以選擇Hale-Stark定律、Schwabe週期或者某種動力學系統模型等。為了確定模型中的未知引數,我們可以利用歷史觀測資料採用最小二乘法進行引數辨識。

最小二乘法:

假設我們有一個擬合模型 f(x,θ),其中x 是時間變數,θ=[θ1​,θ2​,...,θn​] 是待估計的模型引數向量。已知一系列太陽黑子活動觀測資料yi​ 對應於時間點 xi​ (i=1, 2, ..., m),目標是透過調整引數 θ 來使模型輸出與實際觀測值之間的誤差平方和最小。這個最佳化問題可以用以下數學公式表示:

引數辨識步驟:

初始化引數:首先為模型引數設定初始值。
構建目標函式:根據上述公式構建誤差平方和作為目標函式。
求解最優引數:運用梯度下降法、牛頓法或其他最佳化演算法找到使目標函式極小化的引數值θ^。
模型預測

一旦透過最小二乘法得到最佳引數估計θ^,就可以使用此引數對未來的太陽黑子活動進行預測:

應用例項 以一個簡單的線性模型為例(雖然太陽黑子活動通常具有非線性特徵):

這裡的引數向量θ=[θ0​,θ1​],分別代表截距和斜率。採用最小二乘法就是要找出使得下式最小的 θ0​ 和θ1​:

在實際應用中,針對太陽黑子活動這類複雜的自然現象,可能需要選擇更高階別的非線性模型,並結合其他科學理論和觀測資料進行分析。同時,對於複雜模型,可能會涉及更多最佳化方法和技術,如正則化最小二乘法以防止過擬合等問題。

相關文章