使用最小二乘法擬合直線C,求用C 實現最小二乘法曲線擬合程式碼

2021-05-05 17:03:35 字數 4439 閱讀 5029

1樓:雨過天晴

這是通過除錯的程式,可以試試

#include

#include

#include

using namespace std;

class leastsquare

} }

求c或c++語言編寫的用最小二乘法進行曲線擬合

2樓:匿名使用者

你的近似解析表示式為y=at+bt^2+ct^2

是不是想寫成為y=at+bt^2+ct^3

但是實際擬合出來的表示式為y=a[3]+a[2]t+a[1]t^2+a[0]t^3會有個常數項的。

簡單的講,所謂擬合是指已知某函式的若干離散函式值,通過調整該函式中若干待定係數f(λ1, λ2,…,λ3), 使得該函式與已知點集的差別(最小二乘意義)最小。如果待定函式是線性,就叫線性擬合或者線性迴歸(主要在統計中),否則叫作非線性擬合或者非線性迴歸。表示式也可以是分段函式,這種情況下叫作樣條擬合。

曲線擬合:

#include

#include

#include

#include

smooth(double *x,double *y,double *a,int n,int m,double *dt1,double *dt2,double *dt3);

void main()

y = (double *)calloc(n,sizeof(double));

if(y == null)

a = (double *)calloc(n,sizeof(double));

if(a == null)

for(i=1;i<=n;i++)

y[0]=0;

y[1]=1.27;

y[2]=2.16;

y[3]=2.86;

y[4]=3.44;

y[5]=3.87;

y[6]=4.15;

y[7]=4.37;

y[8]=4.51;

y[9]=4.58;

y[10]=4.02;

y[11]=4.64;

/*x[i-1]點對應的y值是擬合已知值*/

呼叫擬合函式*/

for(i=1;i<=m;i++)

printf("a[%d] = %.10f\n",(i-1),a[i-1]);

printf("擬合多項式與資料點偏差的平方和為:\n");

printf("%.10e\n",dt1);

printf("擬合多項式與資料點偏差的絕對值之和為:\n");

printf("%.10e\n",dt2);

printf("擬合多項式與資料點偏差的絕對值最大值為:\n");

printf("%.10e\n",dt3);

free(x); /*釋放儲存空間*/

free(y); /*釋放儲存空間*/

free(a); /*釋放儲存空間*/

} smooth(double *x,double *y,double *a,int n,int m,double *dt1,double *dt2,double *dt3)//(x,y,a,n,m,dt1,dt2,dt3 )

//double *x; /*實型一維陣列,輸入引數,存放節點的xi值*/

//double *y; /*實型一維陣列,輸入引數,存放節點的yi值*/

//double *a; /*雙精度實型一維陣列,長度為m。返回m一1次擬合多項式的m個係數*/

//int n; /*整型變數,輸入引數,給定資料點的個數*/

//int m; /*整型變數,輸入引數,擬合多項式的項數*/

//double *dt1; /*實型變數,輸出引數,擬合多項式與資料點偏差的平方和*/

//double *dt2; /*實型變數,輸出引數,擬合多項式與資料點偏差的絕對值之和*/

//double *dt3; /*實型變數,輸出引數,擬合多項式與資料點偏差的絕對值最大值*/

t = (double *)calloc(n,sizeof(double));

if(t == null)

b = (double *)calloc(n,sizeof(double));

if(b == null)

z = 0;

for(i=1;i<=n;i++)

z=z+x[i-1]/n; /*z為各個x的平均值*/

b[0]=1;

d1=n;

p=0;

c=0;

for(i=1;i<=n;i++)

c=c/d1;

p=p/d1;

a[0]=c*b[0];

if(m>1)

c=c/d2;

p=g/d2;

q=d2/d1;

d1=d2;

a[1]=c*t[1];

a[0]=c*t[0]+a[0];

} for(j=3;j<=m;j++)

c=c/d2;

p=g/d2;

q=d2/d1;

d1=d2;

a[j-1]=c*s[j-1];

t[j-1]=s[j-1];

for(k=j-1;k>=1;k--) }

*dt1=0;

*dt2=0;

*dt3=0;

for(i=1;i<=n;i++)

/*釋放儲存空間*/

free(s);

free(t);

free(b);

return(1);}

3樓:

#include

void main()

; double y[21] = ;

double midx;

double midy;

midx=0;

midy=0;

///求平均值

for(int i=0;i<21;++i)///求斜率

double linek;

linek=0;

double tempmu;

double tempzi;

tempmu=0;

tempzi=0;

for(int v=0;v<21;++v)if(tempmu==0)

linek=tempzi/tempmu;

////求截距

double lineb;

lineb=midy-linek*midx;

////////////

cout <<"直線方程:"<誤差

double delta;

for(int q=0;q<21;++q) }

求用c++實現最小二乘法曲線擬合**

4樓:匿名使用者

你先把最少二乘法的原理搞懂吧,其實最少二乘法不難得。

你可以自己推到,不過這些經典的方法,都有現成公式的了。拿本書找出公式,也就是幾個矩陣的運算,把你的資料帶進去就直接算得出了。

5樓:匿名使用者

用matlab倒是編過 c就沒用過了

如何用c++編寫用最小二乘法進行曲線擬合,而且畫出圖來

6樓:匿名使用者

看一下《數值分析》,裡面有講最小二乘法。

先把數學的算髮寫出來就好了。

首先,得確定一個座標系吧。根據你的資料來設參考系然後用座標算曲線的方程,並用c++表示式寫出來

用excel如何進行最小二乘法的線性擬合?

7樓:仙女王吉吉

y 值輸入抄區域

在此輸入對因變數資料區襲域的引用。bai

該區域必須由單列資料du組成。zhi x 值輸入區域 在此輸入對自dao變數資料區域的引用。

micosoft excel 將對此區域中的自變數從左到右按升序排列。自變數的個數最多為 16。 置信度 如果需要在彙總輸出表中包含附加的置信度資訊,請選中此核取方塊,然後在右側的編輯框中,輸入所要使用的置信度。

如果為 95%,則可省略。

常數為零 如果要強制迴歸線通過原點,請選中此核取方塊。 輸出區域 在此輸入對輸出表左上角單元格的引用。

彙總輸出表至少需要有七列的寬度,包含的內容有 anova 表、係數、y 估計值的標準誤差、2 值、觀察值個數,以及係數的標準誤差。 殘差 如果需要以殘差輸出表的形式檢視殘差,請選中此核取方塊。

標準殘差 如果需要在殘差輸出表中包含標準殘差,請選中此核取方塊。 殘差圖 如果需要生成一張圖表,繪製每個自變數及其殘差,請選中此核取方塊。

線性擬合圖 如果需要為**值和觀察值生成一個圖表,請選中此核取方塊。 正態概率圖 如果需要繪製正態概率圖,請選中此核取方塊。

謝謝,如何用excel進行最小二乘法直線擬合

最小二乘法曲線擬合公式,matlab最小二乘法曲線擬合怎麼取

老弟,公式打不出來的 一般都是用matlab搞定的,它裡面有現成的函式供使用的 典型程式解析 x 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1 input xi data y 1.978 3.28 6.16 7.08 7.34 7.66 9.56 9.48 9.30 1...

最小二乘法的原理是什么的,最小二乘法 的原理是什麼的?

最小二乘法是一種數學優化技術,它通過最小化誤差的平方和找到一組資料的最佳函式匹配。最小二乘法是用最簡的方法求得一些絕對不可知的真值,而令誤差平方之和為最小。最小二乘法通常用於曲線擬合。比如從最簡單的一次函式y kx b講起 已知座標軸上有些點 1.1,2.0 2.1,3.2 3,4.0 4,6 5....

什麼叫最玄乘法什麼叫最小二乘法

最小二乘法是一種數學優化技術 它通過最小化誤差的平方和尋找資料的最佳函式匹配。最小二乘法 又稱最小平方法 是一種數學優化技術。它通過最小化誤差的平方和尋找資料的最佳函式匹配。利用最小二乘法可以簡便地求得未知的資料,並使得這些求得的資料與實際資料之間誤差的平方和為最小。最小二乘法還可用於曲線擬合。其他...