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因...