1 iteration in fsolve: new x and no more
3 Ansichten (letzte 30 Tage)
Ältere Kommentare anzeigen
Sargondjani
am 9 Mär. 2021
Kommentiert: Sargondjani
am 11 Mai 2021
I want to use fsolve to only use one iteration: get the Jacobian, get x1 and done. However when test the code below, which tries to find the zero of x^2, i see the following:
-iteration 0, 2 function evaluations: it seems f(x0) and 1 for finite difference
-iteration 1, 2 function evaluations: it seems f(x1) and 1 for finite difference
I do not want the last two evaluations. Is this possible?
I mean, this doubles the computation time, but it adds nothing for me. Especially since the Jacobian that is reported is the jacobian at x0 (not at x1). If it would at least give me the jacobian at x1 as output i could calculate the next iteration myself.
The solution would to program a similar routine myself, but I rather use fsolve (i also want to use JacobPattern for example).
clear all;
clc;
fun_res = @(xx)xx.^2;
x0 = 1;
ex_fl = -10;
iter = 0;
while ex_fl < 1 && iter < 100
iter = iter+1;
%[xx_it(iter,1),res(iter,1),ex_fl,~,jac(iter,1)] = fsolve(fun_res,x0,optimoptions(@fsolve,'Display','iter','MaxIterations',1));
[xx_it(iter,1),~,ex_fl] = fsolve(fun_res,x0,optimoptions(@fsolve,'Display','iter','MaxIterations',1));
x0 = xx_it(iter);
end
2 Kommentare
Matt J
am 9 Mär. 2021
If it would at least give me the jacobian at x1
I don't know why you think it isn't. The documentation states that the Jacobian should that at the "solution".
Akzeptierte Antwort
Matt J
am 9 Mär. 2021
Bearbeitet: Matt J
am 9 Mär. 2021
One option is to use fsolve just to get the Jacobian and then generate x1 yourself. This gives you access to JacobPattern and all the other Jacobian calculation features that fsolve offers.
To do so, replace your objective function f(x) with f(x)-f(x0), where x0 is thte initial point. Note that this does not change the Jacobian. Because x0 is a root of the modified objective, fsolve will return x0 and its Jacobian as output in zero iterations. Example:
fun=@(x) x.^2/2;
options=optimoptions(@fsolve,'MaxIter',1);
x0=rand(5,1);
f0=fun(x0);
[x,fval,ef,stats,JacobianNumerical]=fsolve( @(x)fun(x) - f0 ,x0,options);
JacobianNumerical,
JacobianAnalytical=diag(x0)
Also, it will do this with no extra Jacobian calculations, as seen from,
stats
6 Kommentare
Weitere Antworten (1)
Matt J
am 9 Mär. 2021
The solution would to program a similar routine myself, but I rather use fsolve (i also want to use JacobPattern for example).
You could also use an existing routine from the File Exchange, like this one,
https://www.mathworks.com/matlabcentral/fileexchange/13490-adaptive-robust-numerical-differentiation
It wouldn't be so difficult to adapt the routine to work with a JacobPattern.
Siehe auch
Kategorien
Mehr zu Systems of Nonlinear Equations finden Sie in Help Center und File Exchange
Produkte
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!