Numerical differentiation for function including vector
7 Ansichten (letzte 30 Tage)
Ältere Kommentare anzeigen
M R
am 2 Jun. 2021
Kommentiert: Walter Roberson
am 7 Jun. 2021
I have implemented a numerical differentiation with central differences. I differentiate the function with respect to a. This appears to be relatively simple for functions containing scalars, e.g.,
. However, once the function also contains a vector, e.g.,
, where c is a 3 by 1 vector, I am struggling to implement this.
, where c is a 3 by 1 vector, I am struggling to implement this.Below I share my code:
rng default
b = randn(1);
c = randn(3, 1);
f1 = @(a) a^4 * b^3;
%f2 = @(a) (a^4 * b^3 * c.').';
a = 1;
k = 3; % no. derivative
h = 0.1; % step size
cent_diff = zeros(k+1,1);
for i = 0:k
cent_diff(i+1, 1) = sum((-1)^i*nchoosek(k,i)*f1(a+(k/2-i)*h));
end
cent_diff = sum(cent_diff)/h^k;
cent_diff = 3.7304
% check result with symbolic differentiation
syms a
f1 = a^4 * b^3;
diff_3 = diff(f1, a, 3);
a = 1;
vpa(subs(d3)) = 3.7304
The differentiation of f2 can be easily achieved using the symbolic approach. How can I get the corresponding result using finite differences?
2 Kommentare
Walter Roberson
am 7 Jun. 2021
cent_diff(i+1, 1) = sum((-1)^i*nchoosek(k,i)*f1(a+(k/2-i)*h));
What is the sum over? k i h are scalar. f1 returns a scalar for scalar input.
If you were looking ahead to the case where f1 might return a vector, then you would not want to sum over that vector.
Akzeptierte Antwort
Walter Roberson
am 7 Jun. 2021
The wikipedia article shows
.
for i = 0:k
cent_diff(i+1, 1) = sum((-1)^i*nchoosek(k,i)*f1(a+(k/2-i)*h));
end
inside that loop, i is scalar. There is no sum at that level. You are effectively recording the terms there
cent_diff = sum(cent_diff)/h^k;
and that is where you are doing the summation.
Now if you use a function such as f2 that returns a vector, then your stray sum() is adding together the individual terms for all of the vector elements. Which is not what you want.
1 Kommentar
Walter Roberson
am 7 Jun. 2021
rng default
b = randn(1);
Nc = 3;
c = randn(Nc, 1);
f1 = @(a) a^4 * b^3;
f2 = @(a) (a^4 * b^3 * c.').';
a = 1;
k = 3; % no. derivative
h = 0.1; % step size
cent_diff = zeros(Nc, k+1);
for i = 0:k
cent_diff(:, i+1) = (-1).^i .* nchoosek(k,i) .* f2(a+(k/2-i)*h);
end
cent_diff
cent_diff = sum(cent_diff,2)./h^k;
cent_diff
Weitere Antworten (1)
Sulaymon Eshkabilov
am 7 Jun. 2021
These answer discussions provide appropriate points how to apply the finite difference method:
Siehe auch
Kategorien
Mehr zu Symbolic Math Toolbox finden Sie in Help Center und File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!