Экспоненциальная аппроксимация методом наименьших квадратов на Scilab

У меня есть два массива x и y, и я хотел бы подобрать к ним экспоненту с параметрами a(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)

person user2993263    schedule 22.07.2014    source источник
comment
Я не знаю scilab, но мне любопытно, что такое переменные yrm и wrm; оказывается, что они не определены (но y и w есть).   -  person    schedule 22.07.2014


Ответы (2)


Это не моя чашка чая, но ваша ошибка в функции 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
person spoorcc    schedule 23.07.2014

Я сделал что-то подобное и избавился от ошибки, предоставив векторы-столбцы вместо векторов-строк, например:

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