Red de conocimiento informático - Conocimiento sistemático - ¡La jungla necesita ayuda! ¡Una pregunta sobre programación en c o matlab!

¡La jungla necesita ayuda! ¡Una pregunta sobre programación en c o matlab!

Tenga en cuenta que lg(x)=ln(x)/ln(10);

Tenga en cuenta que f(x)=lgx x-2, g(x)=f'(x)=1/( x* ln(10)) 1;

Y tenga en cuenta que f(1)=-1, f(2)=lg2, por lo que la única raíz está en .

Use matlab programación, consulte newton.m.

Escriba en la ventana de comandos de matlab

f=@(x)log10(x) x-2;

g=@(x)1/x /log(10) 1;

[x, it, hist, flag]=newton(2, f, g, 100, 1e-10, 0)

Si es necesario El el número máximo de iteraciones es 100, el valor inicial es 1 y la precisión es 10 ^ (-10). Luego, si se usa el método simple de Newton para resolver, el último parámetro es 0 si se usa el método cuesta abajo de Newton; , el último parámetro es 1.

El resultado es:

¡La iteración de Newton es exitosa!

x =

1.75557949926116

it =

4

hist =

2.0000000000 1.75267577698437 1.75557902212685 1.75557949926116

flag =

1

newton.m

función [x, it, hist, flag] = newton (x0, f, g, maxit, tol, dnhl)

lt; Matemáticas numéricas modernas y cálculo gt;206

Utilice el método de Newton para encontrar la función. f Punto cero

Uso: [x, it, hist, flag]=newton(x0, f, g, maxit, tol, dnhl)

Entrada:

x0 punto inicial

función f

g gradiente

maxit número máximo de iteraciones

tolerancia de convergencia tol

hnhl(1/0) búsqueda de línea descendente o no

Salida:

solución x

iteración

historial histórico de iteración

flag(1/0) itera exitosamente o no

if nargin lt; dnh1 = 1; Verifique la entrada predeterminada

if nargin lt; , tol = 1e-6;

if nargin lt; 4, maxit = 100;

if nargin lt; /p>

fin; fin; fin; fin;

bandera = 1; x;

fx = feval(f, x);

for it = 1: maxit, iteración principal

if norm(fx) lt; , Criterio de convergencia

disp('¡Éxitos de la iteración de Newton!')

Retorno

Fin

d = feval(g, x; )\fx Calcular la dirección de búsqueda de Newton

si dnhl == 1,

lambda = 1.0

xn = x - d

<; p> fn = feval(f, xn);

mientras que noem (fn) gt; = norma(fx),

lambda = lambda * 0.5; > if lambda lt; tol,

flag = 0;

error('¡¡paso demasiado corto!!! )

Fin

xn = x - lambda * d;

fn = feval(f, xn

Fin

p> p>

x = xn;

f

x = fn;

De lo contrario, el método de Newton no tiene ningún truco cuesta abajo

x = x-d

fo = fx

fx = feval; (f, x);

if norma(fx) gt; norma(fo),

advertencia('¡¡¡una dirección cuesta arriba!!!!!)

fin

fin

hist = [hist x];

fin

bandera = 0; >disp('¡¡La iteración de Newton falla!!') ;

fin de Newton