Clear Filters
Clear Filters

How to perform a Taylor Expansion on discrete data

28 views (last 30 days)
Hello, I would like to find the taylor coefficients of data given by some vector:
x = -5:0.01:5;
data = 2.^-(x.^2);
plot(x,data)
This 'data' clearly must have some taylor expansion, but the only functions/processes I can find are for symbolic functions.
How can we taylor expand a set of discrete data points?
(I know in this specific case I could've defined the gaussian symbolically, but this is just 'sample data'. I plan to use this on actual measurements)
  2 Comments
Ameer Hamza
Ameer Hamza on 8 Oct 2020
Can you explain what do you mean by Taylor expansion of discrete data points? Taylor series is defined for functions.
Jacob Stamm
Jacob Stamm on 8 Oct 2020
Edited: Jacob Stamm on 8 Oct 2020
Yes, I should've explained better. I meant that I want to find the Taylor series of the function that describes my data. In this case that function is a gaussian, so i'm wondering if it's possible to find the taylor series of a gaussian (for example) if you're only given the discrete data points that make up that gaussian.

Sign in to comment.

Answers (3)

Ameer Hamza
Ameer Hamza on 9 Oct 2020
You can first use lsqcurvefit(): https://www.mathworks.com/help/optim/ug/lsqcurvefit.html or fit(): https://www.mathworks.com/help/curvefit/fit.html to first estimate the Gaussian function from data points. Then use taylor(): https://www.mathworks.com/help/symbolic/sym.taylor.html to compute the taylor series.

Addy
Addy on 15 Feb 2024
Same dude same. Been searching for while now. I came across a numerical implementation of the Taylor expansion from this website for cos(x). There was couple of issues with the function. I corrected it. But Still, it works only with cos(x). Need to figure it out for discrete data.
clear;clf
c = pi/2; % center point for Taylor series expansion
x = (-4:0.1:6)'; % x values for the function
y = cos(x); % y values for a
figure(1);clf;
plot(x, y, 'g')
hold on;grid on
plot(x, taylor_cosine(c, x, 4), 'ro');
plot(x, taylor_cosine(c, x, 6), 'b-.');
plot(x, taylor_cosine(c, x, 10),'k');
title({'Study of Taylor series',...
['cos(x) expansion at x = π/2 (' num2str(c) ')']})
xlabel('x')
ylabel('cos(x) with different number of terms')
axis([-4 6 -3 3])
grid on
legend('cos(x)','4 term s','6 terms','10 terms','Location','north')
function output = taylor_cosine(c, x, n)
% https://matrixlab-examples.com/taylor-expansion.html
% c = center of the function
% x = a vector with values around c
% n = number of terms in the series
tay = zeros(n,length(x)); % Start the series with 0
deriv = [0 -1 0 1]'; % possible derivatives
for i = 0:n-1 % Iterate n times (from 0 to n-1)
tay(i+1, :) = deriv(1) * (x-c).^(i) / factorial(i); % Taylor expansion
deriv = circshift(deriv, -1); % Find derivative for the next term
end
output = sum(tay); % summation of terms
end

Addy
Addy on 15 Feb 2024
Edited: Addy on 15 Feb 2024
as @Ameer Hamza suggested, I tried his route.
For maybe later I will try to use loops for taylor expansion instead of symbolic toolbox.
But for now, it works.
Here is the solution:
clear;clc
syms xx % a variable symbolic function
c = pi/2; % center point for Taylor series expansion
x = (-4:0.1:6)'; % x values for the function
y = cos(x); % y values for a
n = 25; % order to calculate polynomials
%% Polynomial part
p = polyfit(x,y,n); % Polynomialcurve fitting (dont worry about the warning)
Warning: Polynomial is badly conditioned. Add points with distinct X values, reduce the degree of the polynomial, or try centering and scaling as described in HELP POLYFIT.
f_poly = polyval(p,x); % reconstructing curve to compare with original curve
%% Now that we obtained the polynomials, we construct the equation
temp = vectorize(poly2sym(p)); % since we use symbolic, we preserve precision to greater degree
temp = replace(temp,'x','xx');
f_sym = eval(temp); % for taylor series
f_equ = str2func(['@(xx)',temp]); % for plotting again and checking
%% plotting original, curve from polyfit, curve from equation
figure(1);clf;
plot(x,y)
hold on;box on;grid on
plot(x,f_poly)
plot(x,f_equ(x))
axis tight
legend('Original','Polyfit','Polyfit equ','location','south')
%% plotting error between original vs curve from polyfit and equation
% numerical errors happen
e_poly = y-f_poly;
e_equ = y-f_equ(x);
figure(2);clf;hold on
plot(x,e_poly);
yyaxis right
axis tight
plot(x,e_equ);
legend('error polyfit','error equation')
%% Plotting the taylor part
f_tay1 = addy_taylor(f_sym,xx,c,4,x);ylim([-1.5 1.5])
f_tay2 = addy_taylor(f_sym,xx,c,6,x);ylim([-1.5 1.5])
f_tay3 = addy_taylor(f_sym,xx,c,10,x);ylim([-1.5 1.5])
figure(4);clf;
plot(x, y, 'g')
hold on;grid on
plot(x, f_tay1, 'ro')
plot(x, f_tay2, 'b-.')
plot(x, f_tay3, 'k')
axis([-4 6 -3 3])
legend('cos(x)','4 term s','6 terms','10 terms','Location','north')
%% function for taylor expansion and vectorizing
function y = addy_taylor(f_sym,xx,c,n,x)
y = vectorize(taylor(f_sym,xx,c,'Order',n+1));
xx = x;
y = eval(y);
end

Categories

Find more on Particle & Nuclear Physics in Help Center and File Exchange

Products


Release

R2019a

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!