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檔案,不能與...