Las ecuaciones de Rayleigh-Lamb:
(dos ecuaciones, una con el exponente +1 y la otra con el exponente -1) donde
aparecen en consideraciones físicas de las oscilaciones elásticas de placas sólidas. Aquí, es el espesor de una placa elástica, la velocidad de las ondas longitudinales, y la velocidad de las ondas transversales. Estas ecuaciones determinan para cada valor positivo de un conjunto discreto de "valores propios" reales para . Mi problema es el cálculo numérico de estos valores propios y, en particular, obtener curvas que muestren estos valores propios. ¿Qué tipo de método numérico puedo usar con este problema? Gracias.
Editar: Usando los valores numéricos , , , las gráficas deberían verse así (las curvas negras corresponden al exponente -1, las curvas azules al exponente +1; el eje horizontal es y el eje vertical es ):
¿Qué tal si en lugar de encontrar las raíces y luego hacer las gráficas, pasa directamente a las gráficas usando un método de Monte Carlo?
Elija una k aleatoria, luego elija una ω aleatoria y calcule el lado izquierdo y el lado derecho de las ecuaciones RL. Si el RHS está lo suficientemente cerca del LHS (usted elige qué tan cerca), coloque un punto en el gráfico (azul o negro, según la rama que utilizó).
Cuantos más puntos procese y más estricta sea la condición de igualdad RHS=LHS que elija, más precisa será la apariencia del gráfico.
Un problema con este enfoque es que cuando colocas un punto en la gráfica, tu algoritmo no sabe a qué rama pertenece. Pero si es la trama que está buscando, no tendrá problemas para descifrarla a simple vista cuando se complete el cálculo.
Para leer numéricamente de ese diagrama de Monte Carlo, puede ordenar las soluciones que encuentre (ordenarlas en el espacio k o en el espacio ω) y hacer algún tipo de búsqueda usando interpolación.
Aquí hay un código C aproximado para explicar lo que quiero decir:
void main()
{
srand(1);
const int N=1000000000;
const float eps=0.01;
const float cl=...;
const float ct=...;
const float kmax=20.0;
const float omegamax=20.0;
float k, omega, p, q, lhs, rhs;
for (int i=0; i<N; i++)
{
k=(float)rand()/(float)RAND_MAX*k_max;
omega=(float)rand()/(float)RAND_MAX*omega_max;
lhs=tan(...)/tan()...;
rhs=(4.0*k*k...);
if (fabs(lhs-rhs) < eps*fabs(lhs+rhs))
printf("%f %f\n", k, omega);
}
}
y eso es.
Alicia
Timtam
hacer señas
hacer señas
Alicia