Как исправить «неправильно определенную подматрицу» в Scilab? - PullRequest
0 голосов
/ 08 июня 2019

Я пытаюсь найти три параметра (a, b, c), чтобы они соответствовали моим экспериментальным данным с использованием решателя ODE и оптимизации по методу наименьших квадратов с использованием встроенных функций Scilab.Тем не менее, я по-прежнему получаю сообщение «неправильно определена подматрица» в строке «y_exp (:, 1) = [0,135 ...»

Когда я пытаюсь использовать другую серию данных (t, yexp), такую ​​какиспользуется в оригинальном шаблоне я не получаю сообщений об ошибках.Шаблон, который я использую, был найден здесь: https://wiki.scilab.org/Non%20linear%20optimization%20for%20parameter%20fitting%20example

function dy = myModel ( t , y , a , b, c ) 
// The right-hand side of the Ordinary Differential Equation.
dy(1) = -a*y(1) - b*y(1)*y(2) 
dy(2) = a*y(1) - b*y(1)*y(2) - c*y(2)
endfunction 

function f = myDifferences ( k ) 
// Returns the difference between the simulated differential 
// equation and the experimental data.
global MYDATA
t = MYDATA.t
y_exp = MYDATA.y_exp
a = k(1) 
b = k(2) 
c = k(3)
y0 = y_exp(1,:)
t0 = 0
y_calc=ode(y0',t0,t,list(myModel,a,b,c)) 
diffmat = y_calc' - y_exp
// Make a column vector
f = diffmat(:)
MYDATA.funeval = MYDATA.funeval+ 1
endfunction 

// Experimental data 

t = [0,20,30,45,75,105,135,180,240]'; 
y_exp(:,1) = 
[0.135,0.0924,0.067,0.0527,0.0363,0.02445,0.01668,0.012,0.009]'; 
y_exp(:,2) = 
[0,0.00918,0.0132,0.01835,0.0261,0.03215,0.0366,0.0393,0.0401]'; 

// Store data for future use
global MYDATA;
MYDATA.t = t;
MYDATA.y_exp = y_exp;
MYDATA.funeval = 0;

function val = L_Squares ( k ) 
// Computes the sum of squares of the differences.
f = myDifferences ( k ) 
val = sum(f.^2)
endfunction 

// Initial guess
a = 0; 
b = 0; 
c = 0;
x0 = [a;b;c];  

[fopt ,xopt]=leastsq(myDifferences, x0)

Кто-нибудь знает, как решить эту проблему?

1 Ответ

1 голос
/ 11 июня 2019

Просто переписать строки 28,29 как

y_exp = [0.135,0.0924,0.067,0.0527,0.0363,0.02445,0.01668,0.012,0.009 
         0,0.00918,0.0132,0.01835,0.0261,0.03215,0.0366,0.0393,0.0401]'; 

или вставьте clear в строку 1 (ранее вы могли определить y_exp с другим размером).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...