Scilab上的指数最小二乘拟合

时间:2014-07-22 14:49:05

标签: curve-fitting least-squares exponential scilab

我有两个数组x和y,并希望用(1)和a(2)作为拟合参数拟合指数。我写了一个测试代码如下:

k=6.63e-34*3e8/1.38e-23
x=[1;2;3;4;5;6;7;8;9;10]
y=[280;320;369.22772;391.25743;414.74257;
   439.75248;466.06931;493.60396;523.87129;530]
w=[0;0;1;1;1;1;1;1;1;0] //weighting

//fitting function
function y=yth(x,a)
    y=a(1)*exp(-k/x/a(2))
endfunction

//initial parameter guess
a0=[1.0,1.0]

function e=myfun(a,x,y,w)
    e=w.*(yth(x,a)-y)
endfunction

[f,xopt,gopt]=leastsq(list(myfun,x,y,w),a0) 

我遇到以下错误

[f,xopt,gopt]=leastsq(list(myfun,x,y,w),a0) 
!--error 9 
Inconsistent subtraction.
at line       2 of function fn called by :  
at line       2 of function %opt called by :  
at line      92 of function leastsq called by :  
[f,xopt,gopt]=leastsq(list(myfun,x,y,w),a0)

2 个答案:

答案 0 :(得分:0)

这不是我的一杯茶,但你的错误在于yth功能

function y=yth(x,a)
    y=a(1)*exp(-k/x/a(2))
endfunction

k的划分不是按元素划分的,但也可以转置矩阵。

简短演示

k = 5
x = randn(10,1)

// You are doing this in your code
disp( k / x)

// But you are probably wanting to do this
disp( k ./ x )

解决方案

再次,这不是我的茶杯,但它至少解决了错误。

function y=yth(x,a)
    y=a(1)*exp(-k./x/a(2))
endfunction

答案 1 :(得分:0)

我做了类似的事情并通过提供列向量而不是像这样的行向量来消除错误:

[f,xopt,gopt]=leastsq(list(myfun,x',y',w),a0)