Solving an implicit function, fsolve vs. fzero
20 views (last 30 days)
Show older comments
I'm trying to solve an implicit function for x that looks like this:
A*x^q + Bx - C = 0
The solution is within (0,1). Speed is a huge issue. The solution is used to write down a new problem. (A and B both depend on the previous value of x). Both fsolve and fzero are too slow. Any ideas?
Anton Semechko on 5 Jul 2012
You can try the following approach:
abc=rand(3,1); % A, B, C parameters
q=8; % order of the polynomial
Nmax=1E3; % maximum number of iterations
f_tol=1E-6; % convergence tolerance
k=0.9; % relaxation parameter, must be in the range (0,1]
x=0.5; % starting point
f=abc(1)*x^q + abc(2)*x - abc(3); % initial function value
% search for the zero
x=k*x+(1-k)*(x-f); % update x
f=abc(1)*x^q + abc(2)*x - abc(3);
disp([i f x])
if abs(f)<f_tol, break; end
clear q Nmax f_tol k i
I tested the code given above for integer value of q in the range [1,10], and was able to find a solution in at most ~200 iterations. You can also play around with the k parameter to tune the rate of convergence. Note that setting k too low will cause the search to become unstable.
Actually, what I said doesn't work anyway! Too early in the morning, no coffee yet :)
Edited: Richard Brown on 5 Jul 2012
How about doing a fixed number of Newton steps for each problem? (not necessarily doing a convergence check)
A, B, c, q = ...
nSteps = 5;
x = 0.5
for i = 1:nProblems
% Use x from previous problem to update
for i = 1:nSteps
x = x - (A*x^q + B*x + c) / (q*A*x^(q-1) + B);
% Update A, B, c, q to next problem
You could always add in a convergence check, or track the errors if you need to. Of course whether or not this works depends on the parameters of your problem, but with a bit of luck it will.
Find more on Calculus in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!Start Hunting!