Различия в реализации дифференцирования в 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 может быть массивом (то есть с неравномерным интервалом).

Другие вопросы по тегам