Численное вычисление производной комплекснозначной функции в MATLAB


Я хотел бы вычислить производную комплекснозначной функции (Голоморфной функции) численно в MATLAB.

Я вычислил функцию в сетке на комплексной плоскости и попытался вычислить производную, используя соотношения Коши–Римана.

Дано: у = настоящий(Ф), в = б(ф), х = реальный(точка), г = Б(балл)

Производной следует: Ф' = ду/ДХ + и ДВ/ДХ = ДВ/ду - я-ду/ду

Где ' d ' - производный оператор.

У меня есть попробовал следующий код:

stepx = 0.01;
stepy = 0.01;
Nx = 2/stepx +1;
Ny = 2/stepy +1;
[re,im] = meshgrid([-1:stepx:1], [-1:stepy:1]);
cplx = re + 1i*im;
z = cplx.^3;
Производная должна быть задана следующим образом:
f1 = diff(real(z),1,2)/stepx +1i* diff(imag(z),1,2)/stepx;

Или

f2 = diff(imag(z),1,1)/stepy - 1i* diff(real(z),1,1)/stepy;
Но две производные, которые, как предполагается, равны, не совпадают.

Что я делаю не так?


Подсчитаем количество элементов, отличающихся меньше, чем stepx (при условии, что stepx = stepy):

lm = min(size(f1));
A = f1(1:lm,1:lm);
B = f2(1:lm,1:lm);

sum(sum(abs(A - B) <= stepx))

И использование исправления, предложенного @A. Donda

f1i = interp1(1 : Ny, f1, 1.5 : Ny);
f2i = interp1(1 : Nx, f2 .', 1.5 : Nx) .';

sum(sum(abs(f1i - f2i) <= stepx))

Во втором случае все они отличаются меньше, чем stepx, как это должно быть, в то время как в первом случае они отличаются меньше, чем stepx. во-первых, это неправда.

1 4

1 ответ:

Проблема заключается в том, что с помощью двух различных выражений, дискретизированных для использования в Matlab, вы вычисляете приближенные производные в разных точках комплексной плоскости. Предположим, что вы находитесь на мнимом значении y и вычисляете разности вдоль действительной оси x, тогда i-я разность оценивает производную в (x(i) + x(i + 1))/2, то есть во всех средних точках между двумя последующими значениями X. Наоборот, вы оцениваете производную в данном x, но во всех промежуточных точках между двумя последующие y-значения.

Это также приводит к различным размерам результирующих матриц. Используя первую формулу, вы получаете матрицу размером 201x200, другую размером 200x201. Это потому, что в первом варианте есть 200 средних точек вдоль x, но 201 y-значения, и наоборот. Итак, ответ таков: вы не делаете ничего плохого, вы просто неверно интерпретируете результат.

Вы можете решить эту проблему путем явной интерполяции вдоль другого измерения (одного не используется для производной):

f1i = interp1(1 : Ny, f1, 1.5 : Ny);
f2i = interp1(1 : Nx, f2 .', 1.5 : Nx) .';

, где f1 вычисляется по первой формуле, а f2 - по второй. Теперь обе производные оцениваются в точках, которые являются средними точками вдоль обоих измерений, поэтому обе матрицы имеют размер 200x200.

Если вы сравните их сейчас, то увидите, что они идентичны вплоть до численной ошибки (ведь diff вычисляет только приближенные производные и interp1 делает ошибки интерполяции). Для вашего размера шага эта ошибка является максимально 1e-4, и его можно дополнительно уменьшить, используя меньший размер шага.