Taking derivative an array which is a numerical value with respect to another array

Hello,
I need to take a derive of an array (1*101) (which is numerical not analytical)
with respect to another array (1*101). How could I do that in Matlab? Any help please?

 Accepted Answer

Here is a second order approximation to du/dx which should be somewhat more accurate than a first order approximation, and if u is a quadratic function of x, then du/dx is exact (except of course for round-off errors.) Also note that there are as many points in the derivative array as in u and x. I assume in this code that u and x are row vectors of the same length. Intervals in x are not required to be equal.
xd = diff([x(3),x,x(n-2)]); % <-- Corrected
ud = diff([u(3),u,u(n-2)]); % <-- Corrected
dudx = (ud(1:end-1)./xd(1:end-1).*xd(2:end) ...
+ ud(2:end)./xd(2:end).*xd(1:end-1)) ...
./ (xd(2:end)+xd(1:end-1));

3 Comments

Rogger, you are applying some sort of periodic boundary conditions on the vectors. Meva, did not mentioned anything about the periodic boundary conditions.
The best in these cases, when there is no mention of BC, is to use sided stencil on the boundaries.
I'm glad you caught that error, Mohammad. Thank you. I guess my ancient brain had a short-circuit there. The following is what I meant to use. At each end it yields a valid expression for the derivative at the end point for a second degree polynomial running through the three points at that end. Also I should have stated that each array must have a minimum of three elements.
xd = diff([x(3),x,x(n-2)]);
ud = diff([u(3),u,u(n-2)]);
dudx = (ud(1:end-1)./xd(1:end-1).*xd(2:end) ...
+ ud(2:end)./xd(2:end).*xd(1:end-1)) ...
./ (xd(2:end)+xd(1:end-1));
The formula I gave you computes the derivative at one of three adjacent points of your data for the unique second degree polynomial which passes through all three points. Your data does not have to be a polynomial for this to be performed. It can be done on any three points provided they each have different values of x. For reasonably smooth data this usually provides a more accurate estimate of the actual derivative at that given point than is given by the slope of a straight line drawn through two adjacent points.
The code is vectorized so that it gives you the above derivative approximation at each point using it and the surrounding two points. The exception is that at the two end points which each have no points to one side it gives the derivative there using that point and the two points on other side.

Sign in to comment.

More Answers (1)

if f is the vector representing f(x) and x contains the corresponding abscissae
df = diff(f)./diff(x)
note that this has one less element than f and x. You can choose
xd = (x(1:end-1)+x(2:end))/2
(i.e. the halfway points) as the corresponding abscissae.

4 Comments

I have u(i) and x(i) and u is the function of x say. but
That is (u) numerical.
so I cannot see directly what the function is.
So how to do that please?
What I suggest should work. If your numerical values for u are in a vector "u" and those for x are in a vector "x", of the same size as u, then
du = diff(u)./diff(x)
For instance, if u=f(x)=x^3 (I know that u here is "analytical", but for the purpose of the example it is numerical).
x = linspace(1,3,100);
u = x.^3;
then you get the derivative as
du = diff(u)./diff(x);
You can check this in a plot. As I said above, we have to assign the abscissae to du.
xd = (x(1:end-1)+x(2:end))/2;
Then plot dots for the numerical derivative
plot(xd,du,'.');
Hold the plot
hold;
and superimpose the (known, in this case) analytical derivative
plot(x,3*x.^2,'r');
Either use, sided stencil on the boundaries, or if you have boundary conditions use them to set some sort of ghost/dummy nodes.
If you are trying to handle the advective terms u.du/dx+v.du/dy ... in NS equation I suggest that you read Numerical Simulation in Fluid Dynamics: A Practical Introduction It gives a very nice introduction to numerical solutions of NS equations.
You can also look at some of the references in http://www.sciencedirect.com/science/article/pii/S1877050913003530
Many thanks Mohammed. That is right.
I am trying to solve Navier Stokes.

Sign in to comment.

Categories

Asked:

on 2 May 2015

Commented:

on 31 Jan 2018

Community Treasure Hunt

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

Start Hunting!