[C con Clase] Offtopic: Método de diferencias finitas.. programa en c o algoritmo?

Steven Davidson steven en conclase.net
Vie Mar 9 08:04:06 CET 2007


Hola Diego,

El pasado 2007-03-07 21:04:52, D1e6o! escribió:

D> Hola amigos.. Bueno, estoy en un gran problema, debo programar el método de
D> diferencias finitas para aproximar la ecuación de la onda
D> (d^2T/dt^2=alfa*d^T/dx^2) y creo que mi algoritmo está mal, ya que no me da
D> la solución que debería... lo debo hacer en maple, pero si por ahí alguien
D> lo tiene al algoritmo o el programa en c me serviría muchísimo..! ... Perdon
D> por molestar con esto, pero es que debo entregarlo y estoy en los últimos
D> días sin nada de información....! Y en el amigo google no encuentro nada de
D> nada.. Un saludo..!

Bueno, sería conveniente si nos mostraras el algoritmo que tienes y compararlo con el que escribiste. Sospecho que esto ya lo hiciste por tu cuenta, por lo que el otro detalle a analizar es el algoritmo o fórmula en sí.

Al hablar del método de diferencias finitas, realmente estamos hablando de un conjunto de métodos que son: diferencia posterior (o avanzada, o adelantada), diferencia anterior (o retrógrada), y diferencia central o centrada. Para la ecuación diferencial parcial a considerar, sugiero la diferencia central. La "versión" finita y discreta es la siguiente ecuación finita parcial (efp):

d^2T / dt^2 ~ ( T[j,m+1] - 2T[j,m] + T[j,m-1] ) / (Dt)^2
d^2T / dx^2 ~ ( T[j+1,m] - 2T[j,m] + T[j-1,m] ) / (Dx)^2

donde,

Dt := intervalo constante a "discretizar" para el tiempo, t
Dx := intervalo constante a "discretizar" para la longitud, x

x[] := {0,Dx,2Dx,3Dx,...,J*Dx}, donde tenemos J cantidad de intervalos
t[] := {0,Dt,2Dt,3Dt,...,M*Dt}, donde tenemos M cantidad de intervalos

x[j] := j*Dx
t[m] := m*Dt

T[j,m] := T(x[j],t[m]), la solución aproximada para x[j] y t[m]

La solución viene a ser:

T[j,m+1] = 2T[j,m] - T[j,m-1] + K ( T[j+1,m] - 2T[j,m] + T[j-1,m] ), donde

K = c^2 / (Dx/Dt)^2, donde c suele representar la velocidad de la onda

(Nota: En tu enunciado, has usado 'alfa' en lugar de c^2).


Obviamente, necesitamos saber las condiciones iniciales, que típicamente son:

1. T(x,0) = f(x)
2. dT(x,0)/t = g(x)

Usando la efp, las CC.II. finitas son:

1. T[j,0] = f(x[j]) = f(j*Dx)
2. ( T[j,1] - T[j,-1] ) / (2Dt) = g(x[j]) = g(j*Dx)


Espero que todo esto te ayude.

Steven


Más información sobre la lista de distribución Cconclase