Saltar al contenido

Mathematica se ejecuta EXTREMADAMENTE lento (se congela al trazar gráficos para integrales)

Posterior a de nuestra larga selección de información resolvimos este enigma que pueden tener ciertos lectores. Te dejamos la respuesta y deseamos que sea de gran apoyo.

Solución:

Aquí está mi opinión sobre esto. Los puntos clave son el uso de Evaluateasegurarse de Integrate se llama solo una vez y no todas las veces d se llama, y ​​el uso de Assumptionsdonde me tomé la libertad de asumir que k es real.

Espero no haber confundido los límites.

f, m, r = 68000, 2340, 68;
a[k_, t_] := f/(m + k - r t) - 10
d[k_] := Evaluate[
   Integrate[a[k, t], p, 0, k/r, t, 0, p, 
    Assumptions -> k [Element] Reals]];
Plot[d[x], x, 0, 10]

ingrese la descripción de la imagen aquí

para el otro,

r1 = 200;
a1[k_, t_] := f/(m + k - r1 t) - 10
d1[k_] := 
  Evaluate[Integrate[a1[k, t], p, 0, k/r1, t, 0, p, 
    Assumptions -> k [Element] Reals]];
Plot[d1[x], x, 0, 10]

ingrese la descripción de la imagen aquí

Tratar:

$Version
(* "11.2.0 for Microsoft Windows (64-bit) (September 11, 2017)" *)

ClearAll["Global`*"]; Remove["Global`*"];(* Clears All variables *)

f = 68000;
m = 2340;
r = 68;
a[k_?NumericQ, t_?NumericQ] := f/(m + k - r*t) - 10
v[k_?NumericQ, t_?NumericQ] := NIntegrate[a[k, p], p, 0, t, Method -> Automatic, "SymbolicProcessing" -> 0]; 
d[k_?NumericQ] := NIntegrate[v[k, p], p, 0, k/r, Method -> Automatic, "SymbolicProcessing" -> 0];
r1 := 200
a1[k_?NumericQ, t_?NumericQ] := f/(m + k - r1*t) - 10
v1[k_?NumericQ, t_?NumericQ] := NIntegrate[a1[k, p], p, 0, t, Method -> Automatic, "SymbolicProcessing" -> 0]
d1[k_?NumericQ] := NIntegrate[v1[k, p], p, 0, k/r1, Method -> Automatic, "SymbolicProcessing" -> 0]

Plot[d[x], d1[x], x, 0, 10] // AbsoluteTiming

ingrese la descripción de la imagen aquí

Aparte de lo necesario Assumptions mencionado en otras respuestas, su problema es que está abusando de la asignación retrasada: el := operador. Da como resultado que se evalúe el lado derecho. todos vez que llama a su función o usa su variable, a menos que el lado derecho haya sido envuelto con Evaluate función. Es decir, Integrate funciones están reevaluando las integrales cada vez que llamas a tu v, d, v1 y d1 funciones

De la manera adecuada, después de agregar los necesarios Assumptions para las integrales es reemplazar su := con = — al menos para las llamadas a Integrateaunque en su caso específico no necesita ninguna asignación retrasada, por lo que simplemente podría reemplazar todos los operadores con asignaciones inmediatas.

Ahora, si sabe que su variable $k$ en todo el cálculo satisface $kinmathbb R$, entonces puede envolver el cálculo en Assuming función o simplemente establecer $Assumptions variable a su suposición al principio. (No olvide restablecer la variable más tarde al valor predeterminado de True cuando haces cálculos no relacionados).

Después de tener todo esto en cuenta, su código podría verse así:

f = 68000;
m = 2340;
r = 68;
r1 = 200;
a[k_, t_] = f/(m + k - r*t) - 10;
a1[k_, t_] = f/(m + k - r1*t) - 10;
Assuming[Element[k, Reals],
 v[k_, t_] = Integrate[a[k, p], p, 0, t];
 d[k_] = Integrate[v[k, p], p, 0, k/r];
 v1[k_, t_] = Integrate[a1[k, p], p, 0, t];
 d1[k_] = Integrate[v1[k, p], p, 0, k/r1];
 Plot[d[x], d1[x], x, 0, 10]
]

salida del código anterior

Más en := y = las asignaciones se ven en el tutorial Definiciones inmediatas y retrasadas.

Puntuaciones y comentarios

Si tienes algún recelo y capacidad de limar nuestro reseña eres capaz de dejar una glosa y con mucho placer lo interpretaremos.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *