MATLAB中關於lsqcurvefit函式怎麼用的問題

時間 2021-08-13 17:07:40

1樓:匿名使用者

function y=myfun(x,xdata)y=x(1)(exp(-x(4))*(x(4)/x))+x(2)*(x^(-x5))+x(3);

這裡的問題很大。

你一會說x1,x2,x3,一會兒又是x(1),x(2)重要的還有x

描述清楚,問題不大。

弄清楚就好了。

有時間看看我回的一些最小二乘法

2樓:夜風裡唱

這是一個非線性最小二乘法擬合程式

你定義的函式有錯

function y=myfun(x,xdata)y=x(1)(exp(-x(4))*(x(4)/x))+x(2)*(x^(-x5))+x(3);

1. x(1)後面沒有計算符號

2. y函式裡沒有使用xdata,而你的x5憑空而產生,引數沒有傳遞。

3. 你說「x4x5為分佈函式裡的。」但y裡沒有找到x4,但有x(4),但按x(4)這樣的寫法,x(4)也是係數,即x裡的元素。

matlab中lsqcurvefit怎麼用

3樓:匿名使用者

求解曲線擬合問題的一般過程是,先通過觀察曲線形狀大致確定函式的形式,然後對函式的引數有個大概的估計作為初值,擬合後畫出曲線來看看效果,如果效果不理想,就考慮修改初值或函式的形式再試。有時候需要經過多次嘗試才能得到滿意的結果。

需要特別注意以下兩點:

1、與擬合函式的形式有關,如果函式形式選擇不當,不可能得到理想的結果。

例如,對於反比例函式,比較一般的情況應該考慮取1/(c1*x+c2)+c3。

2、擬合問題與初值關係很大,不是隨便指定什麼初值都行的通的。

例如,對於本題,初值如果選擇[0.5 -0.1 1],得到的結果就不太理想;但取[1 1 1]得到的結果就比較滿意。

**及擬合結果如下:

x=1:5;

y=[1 0.83 0.75 0.71 0.68];

f=@(c,x)1./(c(1)*x+c(2))+c(3);

c0=[1 1 1];

[c,resnorm]=lsqcurvefit(f,c0,x,y);

plot(x,y,'.-',x,f(c,x),'r:x')

legend('原始資料','擬合資料')

4樓:shine戚七七

採用matlab的lsqcurvefit函式進行非線性擬合:

1、首先編寫fun.m檔案

function [ f ] = fun( c,x )

%untitled3 summary of this function goes here

% detailed explanation goes here

f=1-8/9.8696.*exp(-9.8696.*c(1).*x/(c(2).^2));

end2、然後編寫data.m進行擬合

clc;clear;

data=[0 0

1 27.33333333

2 37.46666667

3 48.5

4 57.6

5 66.53333333

6 74.43333333

8 85.33333333

10 91.1

12 95.5

14 96.53333333

17 97.3

20 97.93333333

24 98.33333333];

xdata=data(:,1);

ydata=data(:,2)./100;

c0=[1 1];

for i=1:100

c = lsqcurvefit ('fun', c0, xdata, ydata) ;

c0 = c; %以計算出的 c為初值進行迭代;

endc

x=0:0.5:25;

y1=1-8/9.8696.*exp(-9.8696.*c(1).*x/(c(2).^2));

plot(xdata, ydata,'o',x,y1,'r');

legend ('實驗資料 ','擬合曲線');

3、擬合結果

d= 0.0241 l=1.1436

5樓:白肚河蟹不讓說

非線性曲線擬合是已知輸入向量xdata和輸出向量ydata,並且知道輸入與輸出的函式關係為ydata=f(x, xdata),但不知道係數向量x。今進行曲線擬合,求x使得輸出的如下最小二乘表示式成立:

min σ(f(x,xdatai)-ydatai)^2

函式 lsqcurvefit

格式 x = lsqcurvefit(fun,x0,xdata,ydata)

x = lsqcurvefit(fun,x0,xdata,ydata,lb,ub)

x = lsqcurvefit(fun,x0,xdata,ydata,lb,ub,options)

[x,resnorm] = lsqcurvefit(…)

[x,resnorm,residual] = lsqcurvefit(…)

[x,resnorm,residual,exitflag] = lsqcurvefit(…)

[x,resnorm,residual,exitflag,output] = lsqcurvefit(…)

[x,resnorm,residual,exitflag,output,lambda] = lsqcurvefit(…)

[x,resnorm,residual,exitflag,output,lambda,jacobian] =lsqcurvefit(…)

引數說明:

x0為初始解向量;xdata,ydata為滿足關係ydata=f(x, xdata)的資料;

lb、ub為解向量的下界和上界lb≤x≤ub,若沒有指定界,則lb=[ ],ub=[ ];

options為指定的優化引數;

fun為待擬合函式,計算x處擬合函式值,其定義為 function f = myfun(x,xdata)

resnorm=sum ((fun(x,xdata)-ydata).^2),即在x處殘差的平方和;

residual=fun(x,xdata)-ydata,即在x處的殘差;

exitflag為終止迭代的條件;

output為輸出的優化資訊;

lambda為解x處的lagrange乘子;

jacobian為解x處擬合函式fun的jacobian矩陣。

例 求解如下最小二乘非線性擬合問題

已知輸入向量xdata和輸出向量ydata,且長度都是n,待擬合函式的表示式為

ydata(i)=x(1)-xdata(i)^2+x(2)-sin(xdata(i))+x(3)-xdata^3

即目標函式為min σ(f(x,xdata(i))-ydata(i))^2

其中:f(x,xdata) = x(1)*xdata^2 + x(2)*sin(xdata) + x(3)*xdata^3

初始解向量為x0=[0.3, 0.4, 0.1],即表示式的 個引數[x(1),x(2),x(3)]。

解:先建立擬合函式檔案,並儲存為myfun.m

function f = myfun(x,xdata)

f = x(1)*xdata.^2 + x(2)*sin(xdata) + x(3)*xdata.^3;

然後給出資料xdata和ydata

>>xdata = [3.6 7.7 9.3 4.1 8.6 2.8 1.3 7.9 10.0 5.4];

>>ydata = [16.5 150.6 263.1 24.7 208.5 9.9 2.7 163.9 325.0 54.3];

>>x0 = [10, 10, 10]; %初始估計值

>>[x,resnorm] = lsqcurvefit(@myfun,x0,xdata,ydata)

結果為:

optimization terminated successfully:

relative function value changing by less than options.tolfun

x = 0.2269 0.3385 0.3021

=>即解出的係數最優估計值

resnorm = 6.2950

=>在x解值處的目標最小二乘表示式值。即所謂殘差。

6樓:匿名使用者

1、與擬合函式的形式有關,如果函式形式選擇不當,不可能得到理想的結果。例如,對於反比例函式,比較一般的情況應該考慮取1/(c1*x+c2)+c3。

2、擬合問題與初值關係很大,不是隨便指定什麼初值都行的通的。例如,對於本題,初值如果選擇[0.5 -0.1 1],得到的結果就不太理想;但取[1 1 1]得到的結果就比較滿意。

7樓:

首先 看你的資訊說明優化過程並沒有完全失敗 但是你可以用擬合出來的結果自己畫圖看一看,有可能效果不佳。

解決方案:1 調整你的初值 2 擬合方程分母是線性函式,建議把y取倒數後做線性擬合,這樣很容易得到比較精確的結果。

8樓:我行我素

要學習這個函式的用法,可在命令窗中輸入help lsqcurvefit檢視、學習。如有應用問題,可說明是啥問題,便於解答。

9樓:

這句話只是matlab告訴你程式終止的原因,並不

是什麼錯誤。你可以輸入c和resnorm看看,應該有結果的。但是,matlab並不能保證擬合結果一定就符合你的要求,所以你要將c的值代回擬合函式,plot出擬合曲線,看看擬合的效果如何。

10樓:手機使用者

lsqcurvefit(....),具體函式說明見matlab help

lsqcurvefit = least square curve fit(最小二乘曲線擬合),當然你要先確定曲線的形式,函式可以幫你求出待定引數

關於matlab中quad定積分的問題

曲祺 其實沒必要申明變數.這樣就可以 m檔案 function f fsen x f x.2 記得加點哦 在命令窗中輸入 q,n quad fsen,0,2 就得到如下結果 q 2.6667 n 13 當然這麼簡單也沒必要寫m檔案的,這樣或許要簡單點 y inline x.2 x qq,nn qua...

matlab中,關於多元函式的擬合matlab程式如何書寫?(4自變數1因變數)

題主的 4自變數1因變數 多元函式的擬合matlab程式。可以用nlinfit非線性迴歸函式來做 也可以用lsqcurvefit函式 實現 x1 0.55 0.65 0.65 0.65 0.65 0.55 0.55 0.55 0.65 x2 1.6 1.6 1.4 1.6 1.4 1.4 1.6 1...

如何在matlab中呼叫matlab中已有的函式

呼叫函式檔案 myfile.m clear clcfor t 1 10 y mylfg t end 自定義函式檔案 mylfg.m function y mylfg x 注意 函式名 mylfg 必須與檔名 mylfg.m 一致 y x 1 3 注 這種方法要求自定義函式必須單獨寫一個m檔案,不能與...