Is gradient() similar to diff()?

167 views (last 30 days)
Madan Kumar
Madan Kumar on 14 Feb 2021
Commented: Madan Kumar on 14 Feb 2021
Hi,
I have altitude(z) profiles of temperature(T). I need to calculate dT/dz. I calculated gradient(T,h),h is step size. Again, I calculated diff(T)./diff(z) . Both results are different. Which one is correct.

Answers (1)

Walter Roberson
Walter Roberson on 14 Feb 2021
Notice your diff(T)./diff(z) is one entry shorter than gradient(T,h) (which could have been written gradient(T,z)
z = 0:10:90
z = 1×10
0 10 20 30 40 50 60 70 80 90
T = sort(randn(1,10),'descend')
T = 1×10
1.0808 0.6418 0.3712 -0.1580 -0.3233 -0.5326 -0.7267 -0.9016 -1.4800 -2.4100
diff(T)./diff(z)
ans = 1×9
-0.0439 -0.0271 -0.0529 -0.0165 -0.0209 -0.0194 -0.0175 -0.0578 -0.0930
gradient(T,z)
ans = 1×10
-0.0439 -0.0355 -0.0400 -0.0347 -0.0187 -0.0202 -0.0184 -0.0377 -0.0754 -0.0930
You will notice they are all different except for the first and the last.
So they are different. So which one is "right" ?
Answer:
dT/dz is a measure of the rate of change of the continuous function T with respect to the independent variable z. But if you only have discrete T measurements, how do you estimate the rate of change?
You cannot get the "true" rate of change because in theory the "true" function might be have a high frequency sine() wave on it that just happens to contribute the same value (such as 0) to each measured point, so to get the "true" rate of change you would need a symbolic representation of the generating function in order to take its derivative using calculus techniques.
So you need to estimate the rate of change by examining the functions and "nearby" values and fitting an approximating function to them and taking the derivative of the approximating function and evaluating the derivative at a location.
diff() versus gradient() is a difference in approximating function.
diff(T)./diff(z) approximates using which takes into account only one adjacent point.
gradient(T,z) approximates in the middle using "Central Differences", which takes into account data from the previous point, the current point, and the next point. If the approximating function resembles the actual function, it would be expected that using Central Differences would be a better representation of the local slope than using only the slope to the next point.
Consider, for example, that if you have three points, then for the middle point you can fit a quadratic function to the three, then take the derivative and evaluate at the location of the central point. You would mostly expect the result to be a better approximation of the local slope than if you had measured only the slope from the second to third point without taking the first point into account.
There are other gradient techniques such as using cubic spline (which involves 5 points). Going much beyond 5 tends to amplify noise too much.
  4 Comments
Walter Roberson
Walter Roberson on 14 Feb 2021
Even in R2015b the documentation says,
  • N spacing values (h1,h2,...) specifies the spacing for each dimension of F. Scalar spacing parameters specify a constant spacing for each dimension. Vector parameters specify the coordinates of the values along corresponding dimensions of F. In this case, the length of the vector must match the size of the corresponding dimension.
So vectors of exact coordinates are permitted.
So what is happening for you is that your T is not a vector: it is at least 2 dimensional. And you when you take gradient() you have to supply one h parameter for each dimension, and expect as many outputs as you have dimensions. There is no parameter to restrict it to specific dimensions.
z = 0:10:90;
L = 1:5;
T = sort(randn(length(L),length(z)),2,'descend')
T = 5×10
1.8891 1.8149 1.3954 1.1279 0.7642 0.3374 -0.1439 -0.2334 -0.3774 -0.5378 2.0249 1.9570 1.6639 1.5411 1.4652 0.3243 0.3205 -0.2707 -1.2119 -1.4535 1.3176 1.3130 0.7936 0.2390 0.0887 -0.1051 -0.2768 -0.4223 -0.5113 -1.2401 0.9824 0.9276 0.8228 0.3431 0.3212 0.2969 0.2691 -0.1237 -0.6026 -0.9944 2.1536 1.8203 0.7512 0.5212 0.0765 0.0048 -0.0199 -0.5206 -0.8672 -1.4342
diff(T,[],2)./diff(z)
ans = 5×9
-0.0074 -0.0419 -0.0268 -0.0364 -0.0427 -0.0481 -0.0090 -0.0144 -0.0160 -0.0068 -0.0293 -0.0123 -0.0076 -0.1141 -0.0004 -0.0591 -0.0941 -0.0242 -0.0005 -0.0519 -0.0555 -0.0150 -0.0194 -0.0172 -0.0145 -0.0089 -0.0729 -0.0055 -0.0105 -0.0480 -0.0022 -0.0024 -0.0028 -0.0393 -0.0479 -0.0392 -0.0333 -0.1069 -0.0230 -0.0445 -0.0072 -0.0025 -0.0501 -0.0347 -0.0567
size(T), size(L), size(z)
ans = 1×2
5 10
ans = 1×2
1 5
ans = 1×2
1 10
[Gz, GL] = gradient(T,z,L)
Gz = 5×10
-0.0074 -0.0247 -0.0343 -0.0316 -0.0395 -0.0454 -0.0285 -0.0117 -0.0152 -0.0160 -0.0068 -0.0181 -0.0208 -0.0099 -0.0608 -0.0572 -0.0298 -0.0766 -0.0591 -0.0242 -0.0005 -0.0262 -0.0537 -0.0352 -0.0172 -0.0183 -0.0159 -0.0117 -0.0409 -0.0729 -0.0055 -0.0080 -0.0292 -0.0251 -0.0023 -0.0026 -0.0210 -0.0436 -0.0435 -0.0392 -0.0333 -0.0701 -0.0650 -0.0337 -0.0258 -0.0048 -0.0263 -0.0424 -0.0457 -0.0567
GL = 5×10
0.1358 0.1421 0.2684 0.4132 0.7010 -0.0131 0.4643 -0.0373 -0.8345 -0.9157 -0.2857 -0.2510 -0.3009 -0.4445 -0.3378 -0.2212 -0.0665 -0.0944 -0.0670 -0.3512 -0.5213 -0.5147 -0.4205 -0.5990 -0.5720 -0.0137 -0.0257 0.0735 0.3047 0.2295 0.4180 0.2537 -0.0212 0.1411 -0.0061 0.0550 0.1284 -0.0491 -0.1779 -0.0970 1.1712 0.8927 -0.0717 0.1782 -0.2446 -0.2921 -0.2890 -0.3969 -0.2646 -0.4398
Note that the first h parameter to gradient() is for hx, which corresponds to the second dimension; that is why the z values (corresponding to second dimension) appear first.
You are not required to use the second gradient for anything.

Sign in to comment.

Categories

Find more on Programming in Help Center and File Exchange

Products


Release

R2015b

Community Treasure Hunt

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

Start Hunting!