最小二乘法程式(C語言,matlab都可以)

時間 2021-05-06 00:12:41

1樓:我的數學網路

t=20;%t為隨機數個數

x=1:t;

y=rand(1,t);%隨即產生t個隨機數,範圍是0到1,你也可以都乘以某個常數

n=1;%直線擬合n就取1,

p=polyfit(x,y,n);       %計算n次多項式係數p

xi=linspace(0,t,100);%linspace用於產生x1,x2之間的n點行向量

yi=polyval(p,xi);            %計算多項式的值

plot(x,y,'.',xi,yi);

xlabel('x'),ylabel('f(x)')

title('最小二乘法擬合')

p%p即為擬合後的直線的一次項係數和常數項

——————————————————————————————————————

注意:隨機產生的點,因為資料方差比較大,擬合成的直線對於某個點來說相差較大。

比如我測試的p=0.0053    0.4909,那麼,擬合直線就是y=0.0053x+0.4909。

最小二乘法的matlab程式

2樓:飛笛堯琳晨

。。。。。從y裡面把b和c的部分剪掉,然後就不要用二次擬合了,用1次,p=polyfit(x^2,y-bx-c,1),這樣就行了!

3樓:匿名使用者

在matlab中以lsq打頭的系列函式,如lsqcurvefit、lsqlin、lsqnonlin、lsqnonneg等都是用最小二乘法解優化問題的函式,你可以自己看他們的幫助檔案。

4樓:匿名使用者

我給你個最小二乘擬合的例子自己體會一下:

下面給定的是烏魯木齊最近1個月早晨7:00左右(新疆時間)的天氣預報所得到的溫度資料表,按照資料找出任意次曲線擬合方程和它的影象。

(2023年10月26~11月26)

天數 1 2 3 4 5 6 7 8 9 10

溫度 9 10 11 12 13 14 13 12 11 9

天數 11 12 13 14 15 16 17 18 19 20

溫度 10 11 12 13 14 12 11 10 9 8

天數 21 22 23 24 25 26 27 28 29 30

溫度 7 8 9 11 9 7 6 5 3 1

下面應用matlab程式設計對上述資料進行最小二乘擬合

matlab程式**:

x=[1:1:30];

y=[9,10,11,12,13,14,13,12,11,9,10,11,12,13,14,12,11,10,9,8,7,8,9,11,9,7,6,5,3,1];

a1=polyfit(x,y,3) %三次多項式擬合%

a2= polyfit(x,y,9) %九次多項式擬合%

a3= polyfit(x,y,15) %十五次多項式擬合%

b1= polyval(a1,x)

b2= polyval(a2,x)

b3= polyval(a3,x)

r1= sum((y-b1).^2) %三次多項式誤差平方和%

r2= sum((y-b2).^2) %九次次多項式誤差平方和%

r3= sum((y-b3).^2) %十五次多項式誤差平方和%

plot(x,y,'*') %用*畫出x,y影象%

hold on

plot(x,b1, 'r') %用紅色線畫出x,b1影象%

hold on

plot(x,b2, 'g') %用綠色線畫出x,b2影象%

hold on

plot(x,b3, 'b:o') %用藍色o線畫出x,b3影象%

最小二乘法用matlab怎麼實現(求具體程式)

5樓:匿名使用者

function a=multifit(x,y,m)

%a--輸出的擬合多項式的係數

n=length(x);

m=length(y);

if(n ~= m)

disp('資料點座標不匹配!');

return;

endc(1:(2*m+1))=0;

b(1:(m+1))=0;

for j=1:(2*m+1) %求出c和b

for k=1:n

c(j)=c(j)+x(k)^(j-1);

if(j<(m+2))

b(j)=b(j)+y(k)*x(k)^(j-1);

endend

endc(1,:)=c(1:(m+1));

for s=2:(m+1)

c(s,:)=c(s:(m+s));

enda=b'\c; %直接求解法求出擬合係數

%離散試驗資料點的線性最小二乘擬合

function [a,b]=lzxec(x,y)

if(length(x) == length(y))

n = length(x);

else

disp('x和y的維數不相等!');

return;

end %維數檢查

a = zeros(2,2);

a(2,2) = n;

b = zeros(2,1);

for i=1:n

a(1,1) = a(1,1) + x(i)*x(i);

a(1,2) = a(1,2) + x(i);

b(1,1) = b(1,1) + x(i)*y(i);

b(2,1) = b(2,1) + y(i);

enda(2,1) = a(1,2);

s = a\b;

a = s(1);

b = s(2);

%離散試驗資料點的正交多項式最小二乘擬合

function a=zjzxec(x,y,m)

if(length(x) == length(y))

n = length(x);

else

disp('x和y的維數不相等!');

return;

end %維數檢查

syms v;

d = zeros(1,m+1);

q = zeros(1,m+1);

alpha = zeros(1,m+1);

for k=0:m

px(k+1)=power(v,k);

end %x的冪多項式

b2 = [1];

d(1) = n;

for l=1:n

q(1) = q(1) + y(l);

alpha(1) = alpha(1) + x(l);

endq(1) = q(1)/d(1);

alpha(1) = alpha(1)/d(1);

a(1) = q(1);

b1 = [-alpha(1) 1];

for l=1:n

d(2) = d(2) + (x(l)-alpha(1))^2;

q(2) = q(2) + y(l)*(x(l)-alpha(1));

alpha(2) = alpha(2) + x(l)*(x(l)-alpha(1))^2;

endq(2) = q(2)/d(2);

alpha(2) = alpha(2)/d(2);

a(1) = a(1)+q(2)*(-alpha(1));

a(2) = q(2);

beta = d(2)/d(1);

for i=3:(m+1)

b = zeros(1,i);

b(i) = b1(i-1);

b(i-1) = -alpha(i-1)*b1(i-1)+b1(i-2);

for j=2:i-2

b(j) = -alpha(i-1)*b1(j)+b1(j-1)-beta*b2(j);

endb(1) = -alpha(i-1)*b1(1)-beta*b2(1);

bf = b*transpose(px(1:i));

for l=1:n

qx = subs(bf,'v',x(l));

d(i) = d(i) + (qx)^2;

q(i) = q(i) + y(l)*qx;

alpha(i) = alpha(i) + x(l)*(qx)^2;

endalpha(i) = alpha(i)/d(i);

q(i) = q(i)/d(i);

beta = d(i)/d(i-1);

for k=1:i-1

a(k) = a(k)+q(i)*b(k);

enda(i) = q(i)*b(i);

b2 = b1;

b1 = b;

end舉第乙個執行結果的例子吧!

>> x=[3,4,5,6,7,8,9];

>> y=[2.01,2.98,3.50,5.02,5.47,6.02,7.05];

>> multifit(x,y,7)

ans =

columns 1 through 3

0.153705817445571 1.28812217846988 10.9204180096604

columns 4 through 6

93.4341699408163 805.369642330511 6984.42872632458

columns 7 through 8

60878.714442185 532900.1377831

6樓:我的無奈人生

最小二乘法在matlab語言中就是最簡單的函式擬合。

matlab用最小二乘法直線擬合此題(要寫出完整的程式過程,急用,求高手!!!)

7樓:匿名使用者

寫在前面:

喵。。也就我這麼好心。。

。只有15分還幫你寫程式。。。。

如果你將來做技術,你就會經常要搭建數學模型,那麼就會大量運用各種的最小二乘法來擬合模型引數,所以要好好學哦,親~

希望通過這個例子,能夠讓你對最小二乘法入門。。。

開始:最小二乘法,通常用在,我們已知數學模型,但是不知道模型引數的情況下,通過實測資料,計算數學模型,例如,在題目中,數學模型就是直線方程y=ax+b,但是不知道直線方程的a和b。

本來呢,我們只需要兩組(xi,yi),就可以解得a和b,但是由於實測資料都存在誤差,所以,我們很容易想到乙個辦法,我們測很多組資料來讓我的a和b更加準確。

「我們測很多組資料來讓我的a和b更加準確」 ,那麼我從數學角度如何體現這句話呢?

比如在此例中,已知數學模型 y=ax+b

我們有很多組資料,那麼我們要找一條直線,使得我們測得的每個資料,到這條直線的偏離量的總和最小。(這句話有點拗口,慢慢理解下 = =)

那麼怎麼用數學描述「偏離量總和最小」這個概念呢?

數學家運用了方差!

數學模型 y=ax+b

設f=ax+b-y

那麼對於模型上的點(注意是模型上的點,也就是理論值),f=ax+b-y=0

但是對於實際值來說,f=axi+b-yi 一定不等於0。那麼我們就要找到一對a和b,使得f盡可能接近於0。

也就是說,「偏離量總和最小」這個概念,在數學上實際上就是要求f的方差最小。

即 σ f^2→0 (f的平方和趨近於0)

即 σ(axi+b-yi)^2→0

那麼我們得到乙個方程f(a,b)=σ(axi+b-yi)^2,我們要找到合適的a,b使得f(a,b)最小!

也就是說,我們要找到的實際上是f(a,b)的最小值點。(因為方差不可能小於0)

因此我們需要求f(a,b)的極值點。我們借助數學工具偏導。

如果有一組a,b使得

∂f(a,b)/∂a=0

∂f(a,b)/∂b=0

那麼f(a,b)就是極值點,如果a,b只有一對,那麼它就是最小值點。

即 ∂( σ(axi+b-yi)^2 )/∂a=0

∂( σ(axi+b-yi)^2 )/∂b=0

化簡得到

a*σxi^2 + b*σxi = σ(xi*yi)

a*σxi + b*n = σyi

其中n是(xi,yi)的個數。即我們測了多少組資料

解上面的二元方程,我們就可以得到唯一的一組a,b啦,這就是我們所需要的a和b

o(∩_∩)o~是不是蠻簡單的?

matlab最基礎的程式如下。。。= =

%原始資料

x=[163 123 150 123 141];

y=[186 126 172 125 148];

n=5; %一共5個變數

x2=sum(x.^2); % 求σ(xi^2)

x1=sum(x); % 求σ(xi)

x1y1=sum(x.*y); % 求σ(xi*yi)

y1=sum(y); % 求σ(yi)

a=(n*x1y1-x1*y1)/(n*x2-x1*x1); %解出直線斜率b=(y1-a*x1)/n

b=(y1-a*x1)/n; %解出直線截距

%作圖% 先把原始資料點用藍色十字描出來

figure

plot(x,y,'+');

hold on

% 用紅色繪製擬合出的直線

px=linspace(120,165,45);

py=a*px+b;

plot(px,py,'r');

結果 a=1.5555 b=-66.365

喵~希望對你有幫助。。眼淚汪汪。。啪嗒啪嗒。。。

matlab,最小二乘法,指數型函式

問題分析 time 0 1 24 tem 15,14,14,14,14,15,16,18,20,20,23,25,28,31,32,31,29,27,25,24,22,20,18,17,16 f inline x 1 exp x 2 t x 3 2 x t x0 30 0.1 15 x lsqcur...

怎樣使用excel計算最小二乘法

擊掌慶賀 設yi a bxi 將已知yi,xi列於excel表a,b列中例如yi位於a1 a10,xi位於b1 b10則可利用函式計算 斜率 slope a1 a10,b1 b10 截距 intercept a1 a10,b1 b10 怎樣用excel進行多元最小二乘法的計算? 1 將方程組輸入ex...

請問Eviews做出最小二乘法的結果,這個圖怎麼看呢,主要的

最後乙隻恐龍 coefficient是係數,ser02 10是這些變數 有些變數比如01沒有意義,捨去了 c是常數項 eviews最小二乘法得到的結果,每個資料是什麼意思? 劉得意統計服務 內容很多,抓 copy關鍵點就行了。一看判定系bai數r方,為0.72,擬合優度尚du可。具體地說,在zhi因...