How can i implement my method ?
2 vues (au cours des 30 derniers jours)
Afficher commentaires plus anciens
I know the classic newton method but i can not implement the fourier form please help me.
%Newton-Raphson method
clear;
clc
%first plot the function
plot(f) x=0:0.05:4;
f=@(x)(x^3)+(x^2)-(x)-1;
plot(x,f(x));
grid
fd=@(x)3*x^2+2*x-1;
x1=input ('x1=');
tol=0.000001;
i = 0;
while abs(f(x1)) > tol
f1=f(x1);
f1d=fd(x1);
x2=x1-(f1/f1d);
f2=f(x2);
x1=x2;
i = i + 1;
fprintf('%9.6f %13.6f \n',x2,f2)
end
3 commentaires
Réponse acceptée
Morgan
le 6 Nov 2022
Here is a function I've created that hopefully answers your question:
function [x,fval,fevals] = NewtonFourier(f,ab,tol)
% NEWTONFOURIER Function that will efficiently find the local zero
% of an arbitrary function within a specified initial
% guess and tolerance.
%
% [x,fval,fevals] = NEWTONFOURIER(f,x0,tol);
%
% INPUT ARGUMENTS
% ================
% f Function handle to function to be searched
% ab Interval [a,b] in which root is assumed to be
% tol Desired relative error
%
% OUTPUT ARGUMENTS
% ================
% x The coordinate where f(x) = 0
% fval The evaluation of f(x)
% fevals Number of times the func was evaluated
% CHECK IF PROBLEM IS LIKELY UNSOLVABLE
if f(ab(1))*f(ab(2)) > 0
warning('f(a)f(b) > 0, there likely is no solution in [a,b].');
end
% DETERMINE APPROXIMATE DERIVATIVES OF func
fp = @(x) (f(x+tol)-f(x-tol))/(2*tol);
% INITIALIZE fevals
fevals = 2;
% INITIALIZE xn AND zn
xn = ab(2);
zn = ab(1);
% MAIN LOOP
err = Inf;
while err > tol
% Update root estimates
fxn = f(xn)/fp(xn);
xn = xn - fxn;
fzn = f(zn)/fp(zn);
zn = zn - fzn;
% Determine if converged
err = abs((fxn+fzn)/2);
% Update function evaluation counter
fevals = fevals+6;
end
% RETURN OUTPUTS
x = xn;
fval = f(xn);
fevals = fevals+1;
end
I've also written a demo file that solves the specific problem you've referenced in your question here:
% demo_NewtonFourier.m
% Initialize MATLAB
clear variables
close all
clc
% Define NewtonFourier.m Inputs
f = @(x) x.^3 + x.^2 + 1;
tol = 1e-6;
ab = [ -2 +2 ];
% Plot Function
x = ab(1) : 0.05 : ab(2);
y = f(x);
figure(1);
hold on
plot(x,y,'-k','LineWidth',2);
plot(x,0*x,'--k','LineWidth',1);
hold off
xlabel('$x$','Interpreter','latex');
ylabel('$f(x)$','Interpreter','latex');
title(['$ f(x) = ' latex(f(sym('x'))) '$'],'Interpreter','latex');
set(gca, 'FontSize', 12, 'FontName', 'Times', ...
'XMinorTick', 'on', 'YMinorTick', 'on', ...
'TickLength', [0.015, 0.0015]);
% Call NewtonFourier.m
[x,fval,fevals] = NewtonFourier(f,ab,tol)
The outputs of this demo file include the following figure showing the only real solution to be approximately -1.46,
![](https://www.mathworks.com/matlabcentral/answers/uploaded_files/1182833/image.png)
And
x =
-1.4656
fval =
4.4409e-16
fevals =
153
If you require explanation of the code snippets or need anything else, let me know!
- Morgan Blankenship, B.S., M.S., EIT
4 commentaires
Walter Roberson
le 6 Nov 2022
Are you prepared to pay Morgan private consulting fees for providing a private solution to your question?
Plus de réponses (0)
Voir également
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!