Различия в реализации дифференцирования в MATLAB
Я пытаюсь найти (числовую) кривизну в определенных точках. У меня есть данные, хранящиеся в массиве, и я хочу найти локальную кривизну в каждой отдельной точке. Я искал и нашел три различных реализации для этого в MATLAB: diff
, gradient
, а также del2
,
Если имя моего массива arr
Я пробовал следующие реализации:
curvature = diff(diff(arr));
curvature = diff(arr,2);
curvature = gradient(gradient(arr));
curvature = del2(arr);
Первые два, похоже, выдают одинаковые значения. Это имеет смысл, потому что они по сути одна и та же реализация. Тем не менее gradient
а также del2
реализации дают разные значения друг от друга и от diff
,
Я не могу понять из документации, как именно работают реализации. Я предполагаю, что некоторые из них являются двусторонними производными, а некоторые не являются двусторонними. Еще одна вещь, которая меня смущает, это то, что мои текущие реализации используют только данные из arr
, arr
мои данные по оси Y, ось X по существу время. По умолчанию эти функции имеют размер шага 1 или что-то в этом роде?
Если это поможет, я хочу реализацию, которая принимает кривизну в текущей точке, используя только предыдущие элементы массива. Для контекста, мои данные таковы, что расчет кривизны на основе данных в будущем текущей точки не будет полезен для моих целей.
Мне нужна строгая кривизна в точечной реализации, которая использует только данные слева от точки.
Изменить: я вроде лучше понимаю, что происходит на основе этого, благодаря ответам ниже. Это то, что я имею в виду:
gradient
вычисляет центральную разницу для внутренних данных. Например, рассмотрим матрицу с разнесенными на единицу данными, A, которая имеет горизонтальный градиент G = градиент (A). Внутренние значения градиента G(:,j)
G(:,j) = 0.5*(A(:,j+1) - A(:,j-1));
Индекс j изменяется от 2 до N-1, причем N = размер (A,2).
Тем не менее, я все еще хочу знать, как сделать "левостороннее" вычисление.
1 ответ
diff - это просто разница между двумя соседними элементами в arr, именно поэтому вы теряете 1 элемент за использование diff один раз. Например, 10 элементов в массиве имеют только 9 различий.
Градиент и Del2 для производных. Конечно, вы можете использовать diff для аппроксимации производной путем деления разницы по шагам. Обычно шаг равномерно распределен, но это не обязательно. Это отвечает на ваш вопрос, почему х не используется в расчете. Я имею в виду, это нормально, что ваш х не равномерно.
Итак, почему градиент дает нам массив с такой же длиной исходного массива? В руководстве четко объясняется, как обрабатывается граница,
Значения градиента по краям матрицы вычисляются с односторонними> разностями, так что
G (:, 1) = A (:, 2) - A (:, 1);
G (:, N) = A (:, N) - A (:, N-1);
Двойной градиент и del2 не обязательно совпадают, хотя они сильно коррелированы. Это все потому, как вы вычисляете / аппроксимируете производные 2-го порядка. Разница в том, что первая аппроксимирует 2-ю производную, выполняя 1-ю производную дважды, а вторая напрямую аппроксимирует 2-ю производную. Пожалуйста, обратитесь к справочному руководству, формула документирована.
Хорошо, вы действительно хотите кривизну или 2-ю производную для каждой точки на обр? Они очень разные. https://en.wikipedia.org/wiki/Curvature
Вы можете использовать diff, чтобы получить 2-ю производную слева. Поскольку diff принимает разницу справа налево, например, x(2)-x(1), вы можете сначала перевернуть x слева направо, а затем использовать diff. Некоторые коды, такие как,
x=fliplr(x)
first=x./h
second=diff(first)./h
где h - пространство между x. Заметьте, что я использую./, что указывает на то, что h может быть массивом (то есть с неравномерным интервалом).