J'essaye d'implémenter une fonction rk4 pour résoudre 2 équations différentielles. J'ai ce code qui implémente la méthode Runge Kutta 4:Lotka-Volterra Modèles dans Swift 3
//RK4 method
func rk4_func(y_array: [Double], f_array: [(([Double], Double) -> Double)], t_val: Double, h_val: Double) -> [Double] {
let length = y_array.count
let t_half_step = t_val + h_val/2.0
let t_step = t_val + h_val
var k1 = [Double](repeating: 0.0, count: length)
var k2 = [Double](repeating: 0.0, count: length)
var k3 = [Double](repeating: 0.0, count: length)
var k4 = [Double](repeating: 0.0, count: length)
var w = [Double](repeating: 0.0, count: length)
var result = [Double](repeating: 0.0, count: length)
for i in 0...length {
k1[i] = h_val * f_array[i](y_array, t_val)
w[i] = y_array[i] + k1[i]/2.0
}
for i in 0...length {
k2[i] = h_val * f_array[i](w, t_half_step)
w[i] = y_array[i] + k2[i]/2.0
}
for i in 0...length {
k3[i] = h_val * f_array[i](w, t_half_step)
w[i] = y_array[i] + k3[i]
}
for i in 0...length {
k4[i] = h_val * f_array[i](w, t_step)
}
for i in 0...length {
result[i] = y_array[i] + (k1[i] + 2.0*k2[i] + 2.0*k3[i] + k4[i])/6.0
}
print(result)
return result;
}
Mais maintenant, je dois effectivement utilisation, ce qui est la partie que je suis confus au sujet. Si quelqu'un a de l'expérience en calcul numérique des solutions aux équations différentielles, cela aiderait.
De quels tableaux ai-je besoin pour alimenter cette fonction?
Que représente l'argument
t_val
? Est-ce un temps maximum?Comment la sortie "résout" l'équation?
Que me donne la sortie? Dans la ligne
k1[i] = h_val * f_array[i](y_array, t_val)
, que signifief_array[i](y_array, t_val)
? Est-ce que cela signifie que pour la valeuri-th
de f_array, trouvez la valeuri-th
correspondante pour y_array? Alors qu'est-ce que let_val
signifie là?
Pour référence, voici les 2 équations différentielles à résoudre. Le contexte est que j'essaie de résoudre numériquement ces modèles de Lotka-Volterra pour tracer une série temporelle et un tracé d'espace de phase dans Xcode (Swift 3.x).
Dans l'appel 'k2 [i] = h_val * f_array [i] (w, t_half_step)', le résultat est-il calculé comme un vecteur lors de la première exécution de la boucle? Si ce n'est pas le cas, la valeur changée de 'w [i]' ferait des ravages avec la méthode. – LutzL
Je pense que vous voulez dire 'array', pas vectoriel. Swift utilise 'arrays'. Et oui, toutes les variables 'k' sont' arrays'. – loltospoon
La question est de savoir à quel moment 'f_array [1]' est évalué? Pour que tout se passe bien, il devrait être simultanément avec 'f_array [0]'. Et cela rendrait le code plus simple si cela pouvait être fait avec des vecteurs doubles (impliquant des opérations vectorielles) au lieu de doubles tableaux nus. – LutzL