2015-09-14 4 views
4

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

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

Дано: и = реальная (е), V = емк (е), х = реальная (точка), у = емк (точка)

производное должно быть задано: F»= ди/dx + i dv/dx = dv/dy - i du/dy

где '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 = степы):

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, как это должно быть, в то время как в первом случае это не так.

ответ

1

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

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

Итак, ответ: вы ничего не делаете неправильно, вы просто неправильно интерпретируете результат.


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

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

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

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