Двойной ряд Фурье в MATLAB

Я хотел бы построить сетку для функций f и g ниже в MATLAB: f и это двойной ряд Фурье g

Я пробовал это для f и g:

%% plot f
[x,y] = meshgrid(linspace(-pi,pi,50));
f = x.*y ;
subplot(1,2,1)
mesh(f)
title('f')

%% plot g
syms  m n
A = 4*(-1)^(m+n)*(sin(m*x)*sin(n*y))/(m*n);
g = symsum(symsum(A,n,1,inf),m,1,inf);
subplot(1,2,2)
mesh(g)
title('g')

Результат mesh:

результат сетки

Отображение участка f выполняется без ошибок. Другой участок графика g ничего не показывает на рисунке. Как я могу построить g?


person asys    schedule 10.11.2016    source источник
comment
это не ошибка кода. извините, я исправил свой вопрос.   -  person asys    schedule 10.11.2016
comment
Почему вы используете символьную математику для g? Просто не делайте этого, вы все равно не сможете рисовать символы.   -  person Adriaan    schedule 10.11.2016
comment
так как я могу определить суммирование без symsum?   -  person asys    schedule 10.11.2016
comment
Вы пытаетесь уйти в бесконечность, это займет бесконечно много времени. Напишите цикл for и выйдите в определенном порядке n и m и посмотрите, насколько похож результат.   -  person Adriaan    schedule 10.11.2016
comment
кто-нибудь поможет мне написать циклы for, я устал и полностью запутался с этим кодом, извините   -  person asys    schedule 10.11.2016
comment
Нет, так как Stack Overflow не является службой написания кода. Просто переберите как m, так и n и просуммируйте в конце оба измерения.   -  person Adriaan    schedule 10.11.2016


Ответы (2)


Если вы собираетесь работать с символьной математикой, рекомендуется освоиться с допущения, особенно при работе с периодическими функциями и функциями с разрывами. Вы также можете использовать fmesh (или ezmesh в более старых версиях) для построения сетки символьных выражений:

syms m n x y
assume(in(m,'integer') & m>=1);
assume(in(n,'integer') & n>=1);
assume(x>-pi & x<pi);
assume(y>-pi & y<pi);
A = 4*(-1)^(m+n)*(sin(m*x)*sin(n*y))/(m*n);

g = symsum(symsum(A,n,1,Inf),m,1,Inf);
fmesh(g,5*[-pi pi -pi pi],'MeshDensity',1e2); % or ezmesh(g,5*[-pi pi -pi pi]);

Это создает такой сюжет: fmesh plot

Другой вариант — оценить g численно, используя subs и double, а затем используйте mesh для построения графика:

[X,Y] = meshgrid(linspace(-5*pi,5*pi,100));
g2 = real(double(subs(g,{x,y},{X,Y})));
mesh(g2);

или используйте matlabFunction для создания числовой функции:

g2 = matlabFunction(g);
[X,Y] = meshgrid(linspace(-5*pi,5*pi,100));
mesh(real(g2(X,Y)));

В обоих этих последних случаях необходимо использовать real для отсечения незначительных мнимых частей из-за численной неточности.

person horchler    schedule 10.11.2016

Если вам нужен явный способ сделать это с помощью цикла for, вот он:

XY = 2*linspace(-pi,pi,50);
N = 100;
M = 100;
G = zeros(numel(XY));
tmp = zeros(M*N,1);
cx = 1;
for x = XY
    cy = 1;
    for y = XY
        c = 1;
        for m = 1:M
            for n = 1:N
                tmp(c) = 4*(-1)^(m+n)*(sin(m*x)*sin(n*y))/(m*n);
                c = c+1;
            end
        end
        G(cx,cy) = sum(tmp);
        cy = cy+1;
    end
    cx = cx+1;
end
mesh(G)
title('g')

И это немного более компактный способ, который должен быть быстрее:

XY = 2*linspace(-pi,pi,50);
N = 100;
M = 100;
G = zeros(numel(XY));
cx = 1;
for x = XY
    cy = 1;
    for y = XY
        gfun = @(m,n) 4.*(-1).^(m+n).*(sin(m.*x).*sin(n.*y))./(m.*n);
        tmp = bsxfun(gfun,(1:M).',1:N);
        G(cx,cy) = sum(tmp(:));
        cy = cy+1;
    end
    cx = cx+1;
end
mesh(G)

и результат:

Фурье

person EBH    schedule 10.11.2016