Численное вычисление производной комплекснозначной функции в 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 ответ:
Проблема заключается в том, что с помощью двух различных выражений, дискретизированных для использования в Matlab, вы вычисляете приближенные производные в разных точках комплексной плоскости. Предположим, что вы находитесь на мнимом значении y и вычисляете разности вдоль действительной оси x, тогда i-я разность оценивает производную в
Это также приводит к различным размерам результирующих матриц. Используя первую формулу, вы получаете матрицу размером 201x200, другую размером 200x201. Это потому, что в первом варианте есть 200 средних точек вдоль x, но 201 y-значения, и наоборот. Итак, ответ таков: вы не делаете ничего плохого, вы просто неверно интерпретируете результат.(x(i) + x(i + 1))/2
, то есть во всех средних точках между двумя последующими значениями X. Наоборот, вы оцениваете производную в данном x, но во всех промежуточных точках между двумя последующие y-значения.
Вы можете решить эту проблему путем явной интерполяции вдоль другого измерения (одного не используется для производной):
f1i = interp1(1 : Ny, f1, 1.5 : Ny); f2i = interp1(1 : Nx, f2 .', 1.5 : Nx) .';
, где
Если вы сравните их сейчас, то увидите, что они идентичны вплоть до численной ошибки (ведьf1
вычисляется по первой формуле, аf2
- по второй. Теперь обе производные оцениваются в точках, которые являются средними точками вдоль обоих измерений, поэтому обе матрицы имеют размер 200x200.diff
вычисляет только приближенные производные иinterp1
делает ошибки интерполяции). Для вашего размера шага эта ошибка является максимально 1e-4, и его можно дополнительно уменьшить, используя меньший размер шага.