Матлаб fittype логарифмической степенной зависимости с y-пер intercept.

Вопрос или проблема

В 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) становится отрицательным или равно нулю. Поскольку мы берем логарифм, это приводит к математически недопустимому выражению.

Условия для корректного фита

Для решения данной проблемы вам нужно учесть следующее:

  1. Условия для параметров: Убедитесь, что параметр b всегда больше нуля, чтобы избежать значений, близких к нулю в модели. Вы можете установить нижнюю границу на параметры в функции fit.

  2. Начальные значения: Хорошо выбирайте начальные параметры для вашей модели. Если 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');

Основные изменения

  1. Добавление границ: Я добавил параметры Lower и Upper для ограничения, чтобы b не мог принимать отрицательные значения.

  2. Использование exp: Поскольку мы логарифмируем y, необходимо выполнять обратное преобразование, используя экспоненту при построении графика.

  3. Ясность переменных: Начальные точки для b установлены на уровне 1, что является безопасным значением для предотвращения отрицательных значений в логарифмической функции.

Заключение

Следуя данным рекомендациям и общим принципам подбора параметров, вы сможете избежать ошибок, связанных с областью определения логарифмической функции. Такие подходы обеспечивают стабильное и корректное поведение при выполнении построений и анализов, способствуя более точному и надежному результату на ваших данных.

Оцените материал
Добавить комментарий

Капча загружается...