2016-11-30 3 views
0

Я пытаюсь установить некоторые данные с помощью Matlab, используя метод наименьших квадратов.while цикл до тех пор, пока не будет выполнено определенное условие на значение функции

Я нашел наиболее подходящие параметры, и теперь я хочу определить неопределенность.

Чтобы определить неопределенность по первому параметру, скажем, мы видели, что мы должны применять вариацию к одному параметру, пока разница между функцией (оцененной при этом измене) минус исходное значение функции равно 1

То есть, у меня есть вектор под названием [bestparam] в моем коде Matlab, содержащий четыре параметра a, b, c и d.

У меня также есть функция, определенная в другом файле, называемая chi-square, которую я оценил с лучшими параметрами.

Теперь я хочу применить небольшое изменение к параметру a и продолжать делать это до тех пор, пока хи-квадрат (a + вариация) - chi-square = 1. Разница должна быть ровно одной. Я применил для этого следующий код:

i = 0; 
a_new = a + i; 
%small variation on the parameter a 
new_param = [a_new b c d]; 
%my new parameters at which I want the function chisquare to be evaluated 
newchisquare = feval(@chisquare, [new_param], X, Y, dY); 
%the function value 
while newchisquare - chisquarevalue ~= 1 
    i = i + 0.0001; 
    a_new = a_new + i; 
    new_param = [a_new b c d]; 
    newchisquare = feval(@chisquare, [new_param], X, Y, dY); 
end 
disp(a_new); 
disp(newchisquare); 

Но когда я выполняю этот цикл, он никогда не перестает работать. Когда я меняю условие на < 1, то есть разница должна быть больше единицы, а затем останавливается примерно через 5 секунд. Но тогда разница между значениями функций больше не является одной. Например, мое исходное значение функции - 63.5509, а новое - 64.6145, что не совсем 1 больше.

Итак, есть ли способ реализовать код и продолжать обновлять параметр a до тех пор, пока разница не будет равна одному? Помощь приветствуется.

ответ

1

Выполнение численных методов Я бы не рекомендовал использовать такие операции, как == или ~=, если вы не уверены, что вы сравниваете два целых числа. Только небольшие отклонения от вашего значения могут привести к тому, что ваш код никогда не остановится. Вы можете применить некоторый подход к допуску, чтобы сделать ваш код остановленным, если он приблизительно правильный:

TOL = 1e-2; 
while (abs(newchisquare - chisquarevalue) <= 1 - TOL) 
    % your code 
end 
Смежные вопросы