¿Cuál es el pseudocódigo para encontrar la raíz (s) de [math] ax + bx ^ {0.5} + c = 0 [/ math]?

Cuando lo resuelves simbólicamente, obtienes:

[matemática] \ left [\ frac {1} {2 a ^ {2}} \ left (- 2 ac + b ^ {2} – b \ sqrt {- 4 ac + b ^ {2}} \ right), \ quad \ frac {1} {2 a ^ {2}} \ left (- 2 ac + b ^ {2} + b \ sqrt {- 4 ac + b ^ {2}} \ right) \ right] [/ matemáticas]

El pseudocódigo es:

def resolver (a, b, c):
retorno [(-2 * a * c + b ** 2 – b * sqrt (-4 * a * c + b ** 2)) / (2 * a ** 2), (-2 * a * c + b ** 2 + b * sqrt (-4 * a * c + b ** 2)) / (2 * a ** 2)]

Probablemente desee comprobar si [math] b ^ 2 – 4ac [/ math] es positivo, si su idioma no admite números complejos. Además, vuelva a colocar las soluciones en la ecuación original y verifique si son correctas.


Si desea resolverlo numéricamente, puede usar el método de bisección. Citando Wikipedia:

La entrada para el método es una función continua [matemática] f [/ matemática], un intervalo [matemática] [a, b] [/ matemática] y los valores de función [matemática] f (a) [/ matemática] y [ matemáticas] f (b) [/ matemáticas]. Los valores de la función son de signo opuesto (hay al menos un cruce por cero dentro del intervalo). Cada iteración realiza estos pasos:

  1. Calcule [math] c [/ math], el punto medio del intervalo, [math] c = 0.5 \ cdot (a + b) [/ math].
  2. Calcule el valor de la función en el punto medio, [matemática] f (c) [/ matemática].
  3. Si la convergencia es satisfactoria (es decir, [matemática] a – c [/ matemática] es suficientemente pequeña, o [matemática] f (c) [/ matemática] es suficientemente pequeña), devuelva [matemática] c [/ matemática] y pare iterando
  4. Examine el signo de [matemáticas] f (c) [/ matemáticas] y reemplace [matemáticas] (a, f (a)) [/ matemáticas] o [matemáticas] (b, f (b)) [/ matemáticas] con [matemática] (c, f (c)) [/ matemática] para que haya un cruce por cero dentro del nuevo intervalo .

¿Tiene sentido?

El pseudocódigo (está bien, es Python):

de matemáticas import sqrt

def same_sign (a, b):
devuelve a * b> 0

def bisect (func, bajo, alto):
tolerancia = 0.001

afirmar no same_sign (func (bajo), func (alto))

mientras que (alto – bajo) / 2.0> tolerancia:
punto medio = (bajo + alto) / 2.0
if same_sign (func (bajo), func (punto medio)):
bajo = punto medio
más:
alto = punto medio
punto medio de retorno

def f (a, b, c):
devuelve lambda x: a * x + b * sqrt (x) + c

impresión bisecta (f (1.4, -2.5, -0.5), 0, 10) # 3.87084960938

Como [math] x [/ math] representa el tiempo (como has dicho en los comentarios), el nivel bajo puede ser [math] 0 [/ math]. Alto puede comenzar en [matemáticas] 100 [/ matemáticas]. Mientras same_sign(low, high) , make low = high y high += 100 . Luego comience bisect(f(a, b, c), low, high) .


También podrías usar el Newton – Raphson. Aquí usará la derivada de la función (que es [matemática] a + \ frac {b} {2 \ sqrt {x}} [/ matemática]). El algoritmo no es difícil de entender, eche un vistazo a la página de Wikipedia.


Fuente:
http://www.sosmath.com/calculus/…
Método de bisección