Построение символического ряда Фурье - PullRequest
0 голосов
/ 04 мая 2018

Я написал код для ряда Фурье. Это то, что я до сих пор:

function FS = FourierSeries(f,degree)

cosCoefficients = zeros(1,degree);
sinCoefficients = zeros(1,degree);

syms x;

a0 = double((1/pi)*int(f,-pi,pi));


for n = 1:degree
    cosCoefficients = cosCoefficients + (1/pi)*int(f*cos(n*x),-pi,pi);
    sinCoefficients = sinCoefficients + (1/pi)*int(f*sin(n*x),-pi,pi);
end

for n = 1:degree
    FS = 0.5*a0 + cosCoefficients.*cos(n*x) + sinCoefficients.*sin(n*x);
end

Затем я также создал следующий файл функций:

function y = func1(x)
syms x
y = (x^2);
end

Проблема в том, что когда я пытаюсь построить func1 и FS1 = FourierSeries(func1, 4), я получаю сообщение об ошибке

Данные должны быть числовыми, с указанием даты, времени, продолжительности или массива, который можно преобразовать в удвоение.

Как построить этот ряд Фурье?

Ответы [ 2 ]

0 голосов
/ 20 мая 2018

я использую sympy для символической математики в python

from sympy import *
from sympy.plotting import plot
import matplotlib.pyplot as plt
init_printing(use_unicode= True)

x = symbols('x')

def expr1(k):
    x = symbols('x')
    a0 = (integrate(x,(x,-pi,0))+integrate(pi-x, (x,0,pi)))/(2*pi) 
    expr = a0
    stra = 'a1:'+ str(k)
    strb = 'b1:'+ str(k)
    syma = symbols(stra)
    symb = symbols(strb)
    j = 1
    for i in syma:
        i = (integrate(x*cos(j*x),(x,-pi,0))+
        integrate((pi-x)*cos(j*x),(x,0,pi)))/pi
        expr += i*cos(j*x)
        j+=1
    j = 1
    for i in symb:
        i =  (integrate(x*sin(j*x),(x,-pi,0))+
        integrate((pi-x)*sin(j*x),(x,0,pi)))/pi
        expr += i*sin(j*x)
        j+=1
    return expr
plot(expr1(20),(x,-2*pi,2*pi))

график вышеуказанной функции

0 голосов
/ 04 мая 2018
whos FS1
  Name      Size            Bytes  Class    Attributes

  FS1       1x4                 8  sym   

Это говорит о том, что FS1 является символической функцией , которую необходимо оценить, прежде чем вы сможете построить ее:

FS1 = FourierSeries(func1, 4);
xIDX = -10:0.1:10;
array = zeros(size(xIDX));

for ii = 1:numel(xIDX)
    x = xIDX(ii);
    array(ii) = sum(double(subs(FS1)));
end

figure
plot(array)

enter image description here

subs преобразует ваше символическое выражение в строку при условии, что символическая переменная, в данном случае x, присутствует в рабочей области. double затем преобразует строку в фактическое число, и, поскольку в FS есть 4 слагаемых, нам нужно их суммировать, в конце концов, это ряд Фурье.

Еще короче, не оценивайте его численно, а используйте встроенную в MATLAB функцию символьного графика fplot

figure
hold on
fplot(func1,'b')
fplot(sum(FS1),'r') % sum over the Fourier components
legend ('func1', 'FS1')

enter image description here

...