How can i implement my method ?

3 views (last 30 days)
Hazel Can
Hazel Can on 5 Nov 2022
Commented: Bruno Luong on 15 Nov 2022
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 Comments
Rena Berman
Rena Berman on 15 Nov 2022
(Answers Dev) Restored edit
Bruno Luong
Bruno Luong on 15 Nov 2022
EDIT: Format the restored question

Sign in to comment.

Accepted Answer

Morgan
Morgan on 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,
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 Comments
Hazel Can
Hazel Can on 6 Nov 2022
Thank you so much Morgan! It's very useful answers for me.
Have a good day :)
Walter Roberson
Walter Roberson on 6 Nov 2022
Are you prepared to pay Morgan private consulting fees for providing a private solution to your question?

Sign in to comment.

More Answers (0)

Products


Release

R2019a

Community Treasure Hunt

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

Start Hunting!