код отладки, не уверен, почему я не получаю правильное значение для x1 - PullRequest
0 голосов
/ 02 марта 2020
function [x1] = tutorial1(x0,nMax,tol)
% Calculate the root of the function f(x) = x^3 - 3^x + 1
% using the Newton Method of root-finding.
% Inputs: 
%        - x0     initial guess
%        - nMax   number of iterations
%        - tol    solution accuracy tolerance
% Output:
%        - x1     converged root of the equation
% Initialisation of the values x0, nMax, to

x0 = 1.5;
nMax = 15;
tol = 1e-4;

 % for loop acting continously for 15 iterations 
for i = 1:nMax
   fx0= (x0).^3-3.^(x0)+1;
   differentialx0=3.*(x0.^2) - 3.^x0.*log(3);
   %function f(x0)respectively
   x1 = x0 -fx0./differentialx0;

   if abs(x1-x0)<tol
   break
   end 
   x0 = x1; 

   fprintf('Iteration = %d, x0 = %.4f, x1 = %.4f, fx1 = %.4f\n',i,x0,x1);
    end 

 % Sample output code for monitoring (this should be included in your loop structure.


  return

enter image description here

1 Ответ

1 голос
/ 02 марта 2020

Вы получаете правильное значение на самом деле. С этим методом вы численно решаете уравнение. Таким образом, вы сходитесь к решению с требуемой точностью (если она работает), установленной критериями допуска.

Выполните приведенный ниже код. То же самое с большим количеством цифр для печати номера, более строгим допуском и печатью ошибки (и я добавил вычисление fx1 для его печати).

x0 = 1.5;
nMax = 15;
tol = 1e-10; %1e-4

 % for loop acting continously for 15 iterations 
for i = 1:nMax
   fx0= (x0).^3-3.^(x0)+1;
   differentialx0=3.*(x0.^2) - 3.^x0.*log(3);
   %function f(x0)respectively
   x1 = x0 -fx0./differentialx0;
   fx1= (x0).^3-3.^(x0)+1;
   error = abs(x1-x0) ;

   if error<tol
   break
   end 

   x0 = x1; 

   fprintf('Iteration = %i, x0 = %.6f, x1 = %.6f, fx1 = %.6f, error = %.6f \n',i,x0,x1,fx1,error);
    end 

 % Sample output code for monitoring (this should be included in your loop structure.

Вы получите этот вывод в команде:

Iteration = 1, x0 = 2.288476, x1 = 2.288476, fx1 = -0.821152, error = 0.788476 
Iteration = 2, x0 = 1.994137, x1 = 1.994137, fx1 = 0.628953, error = 0.294339 
Iteration = 3, x0 = 2.000009, x1 = 2.000009, fx1 = -0.012367, error = 0.005873 
Iteration = 4, x0 = 2.000000, x1 = 2.000000, fx1 = 0.000020, error = 0.000009 

Это дает решение ближе к 2 (но если вы добавите больше цифр в fprintf, вы увидите, что это не идеальные 2, а что-то вроде 2.000000000001).

Имейте в виду, что если алгоритм сходится, он даст вам численное решение, близкое к теоретическому, с ошибкой, которая зависит от предоставленного вами допуска.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...