Вопрос или проблема
В Matlab я выполняю аппроксимацию кривой для набора точек, которые следуют степенному закону. Если я использую 'log(a*x^n)'
как основной аргумент функции fittype, все работает хорошо:
% ввод
x = [4 9 15 25 35 45 55 65 75 85 95 150 250 350 450 900];
y = [335 28 37 9 4 3.5 2 1 0.7 0.6 0.5 0.3 0.1 0.01 0.005 0.001];
% аппроксимация кривой
ft = fittype('log(a*x^n)','independent','x');
[fitresult, gof] = fit(x',log(y)',ft,'Startpoint', [1 -1]);
% графики
hold on
plot(x,y,'o-','Color','b')
plot(x,(fitresult.a .* (x.^fitresult.n)),'-','color','r')
set(gca, 'XScale', 'log', 'YScale', 'log');
Однако, если я добавлю дополнительный параметр b
(т.е. пересечение с осью y) к предыдущему степенному закону, т.е. теперь 'log(a*x^n + b)'
, в функции fittype…
% ввод
x = [4 9 15 25 35 45 55 65 75 85 95 150 250 350 450 900];
y = [335 28 37 9 4 3.5 2 1 0.7 0.6 0.5 0.3 0.1 0.01 0.005 0.001];
% аппроксимация кривой
ft = fittype('log(a*x^n + b)','independent','x');
[fitresult, gof] = fit(x',log(y)',ft,'Startpoint', [1 -1 1]);
% графики
hold on
plot(x,y,'o-')
plot(x,(fitresult.a .* (x.^fitresult.n)),'-')
set(gca, 'XScale', 'log', 'YScale', 'log');
Я получаю следующую ошибку:
Ошибка при использовании fit>iFit
Комплексное значение, рассчитанное модельной функцией, не позволяет продолжить аппроксимацию.
Попробуйте использовать или уточнить верхние и нижние границы для коэффициентов.
Ошибка в fit (строка 117)
[fitobj, goodness, output, convmsg] = iFit( xdatain, ydatain, fittypeobj, ...
Ошибка в untitled6 (строка 6)
[fitresult, gof] = fit(x',log(y)',ft,'Startpoint', [1 -1 1]);
Как я могу решить эту ошибку и, в общем, заставить функцию fittype работать для логарифмического степенного закона, который включает пересечение с осью y?
Ответ или решение
Для выполнения подбора кривой в Matlab с использованием модели логарифмической степенной функции с учетом параметра y-перехвата, необходимо обратить внимание на то, что добавление y-перехвата влияет на вычисления, особенно если y-перехват (параметр b
) невелик по сравнению с остальными величинами. Рассмотрим, как это можно реализовать, а также как избежать ошибок, подобных той, которая возникла в вашем примере.
Проблема с комплексными значениями
Ошибка, которую вы получили:
Complex value computed by model function, fitting cannot continue.
чаще всего возникает, когда внутренняя функция возвращает комплексные значения. Это может произойти, если выражение (a \cdot x^n + b) становится отрицательным или равно нулю. Поскольку мы берем логарифм, это приводит к математически недопустимому выражению.
Условия для корректного фита
Для решения данной проблемы вам нужно учесть следующее:
-
Условия для параметров: Убедитесь, что параметр
b
всегда больше нуля, чтобы избежать значений, близких к нулю в модели. Вы можете установить нижнюю границу на параметры в функции fit. -
Начальные значения: Хорошо выбирайте начальные параметры для вашей модели. Если
b
– маленькое число, то увеличьте его значение.
Исправленный код
Ниже приведен пример исправленного кода, где добавлены ограничения на параметры:
% Исходные данные
x = [4 9 15 25 35 45 55 65 75 85 95 150 250 350 450 900];
y = [335 28 37 9 4 3.5 2 1 0.7 0.6 0.5 0.3 0.1 0.01 0.005 0.001];
% Настройка модели
ft = fittype('log(a*x^n + b)', 'independent', 'x');
% Начальные параметры
startPoints = [1 -1 1]; % Здесь b равно 1; вы можете попробовать более высокое значение
% Установка границ параметров
lowerBounds = [0 -Inf 0]; % b должно быть больше 0
upperBounds = [Inf Inf Inf]; % Ограничение для a, n и b
% Подбор
[fitresult, gof] = fit(x', log(y)', ft, 'Startpoint', startPoints, 'Lower', lowerBounds, 'Upper', upperBounds);
% График
hold on
plot(x, y, 'o-', 'Color', 'b')
plot(x, exp(fitresult.a .* (x.^fitresult.n) + fitresult.b), '-', 'Color', 'r') % Обратите внимание на exp для перевода назад
set(gca, 'XScale', 'log', 'YScale', 'log');
Основные изменения
-
Добавление границ: Я добавил параметры
Lower
иUpper
для ограничения, чтобыb
не мог принимать отрицательные значения. -
Использование
exp
: Поскольку мы логарифмируемy
, необходимо выполнять обратное преобразование, используя экспоненту при построении графика. -
Ясность переменных: Начальные точки для
b
установлены на уровне 1, что является безопасным значением для предотвращения отрицательных значений в логарифмической функции.
Заключение
Следуя данным рекомендациям и общим принципам подбора параметров, вы сможете избежать ошибок, связанных с областью определения логарифмической функции. Такие подходы обеспечивают стабильное и корректное поведение при выполнении построений и анализов, способствуя более точному и надежному результату на ваших данных.