Utilisez Swift pour trouver une approximation de sinx

Pourquoi Swift?

Vous n'avez pas besoin de créer un environnement pour utiliser Swift, vous pouvez donc commencer tout de suite. Si vous avez un Mac ou un iPad, vous pouvez l'utiliser en installant simplement Playgrounds. De plus, Playgrounds a des fonctions telles que ** exécution d'étape ** et ** exécution lente **, et vous pouvez exécuter des instructions et des minutes pas à pas et vérifier le changement de valeur lorsqu'elles sont exécutées. .. De plus, si vous utilisez la ** fonction de visualisation **, l'état des modifications des variables sera affiché sous forme de graphique sans autorisation. 2020-10-14 11.16のイメージ.jpg

Expansion McLaughlin de Sinx

Lorsque $ sinx $ est développé par McLaughlin, $ sinx = x - \frac{x^3}{3!}+\frac{x^5}{5!}-\frac{x^7}{7!}+⋯+\frac{(-1)^{n-1}x^{2n-1}}{(2n-1)!}+⋯ $

Il a été exprimé comme. Dans cet article, nous utiliserons la programmation pour trouver une approximation de $ sinx $.

1. Préparez les variables

L'expansion de McLaughlin se rapproche de la fonction $ f (x) $, qui peut être différenciée plusieurs fois, par la somme des formules d'expansion de la série des fonctions de puissance de $ x $. Dans cet article, la valeur de $ sinx $ est définie comme «somme» et la valeur est progressivement ajoutée à «somme».

var sum = 0
print(sum)    //0
sum += 1
print(sum)    //1

Vous devez également préparer une constante pour mettre le $ x $ approximatif. À ce stade, je veux utiliser des valeurs telles que $ \ pi / 6 $ et $ \ pi / 3 $ comme valeurs approximatives, alors écrivez ʻimport Foundation` afin que $ \ pi $ puisse être utilisé.

import Foundation
var sum = 0
let x = Double.pi/2

De plus, préparez des variables qui sont continuellement mises à jour sous forme de termes.

var item = x

Le premier terme est le même que la constante, alors entrez «x».

Le code final ressemble à ceci:

2. Codez jusqu'au deuxième terme avec x = π / 2

Je pense qu'il est important de commencer avec une petite valeur et de faire des essais et des erreurs avec une valeur concrète lors du codage. (Vue personnelle). Dans cet article également, selon cette idée, jusqu'au deuxième terme comme $ x = \ pi / 2 , c'est-à-dire $ sinx=x-\frac{x^3}{3!} $$ Codez jusqu'à.

import Foundation
var sum = 0.0  //Puisque le type int et le type double ne peuvent pas être ajoutés,0.Écrivez 0 pour en faire un double type.
var x = Double.pi/2

sum += x
sum += -(x*x*x)/Double(3*2*1)

$ X $ est ajouté à sum, et $ - \ frac {x ^ 3} {3!} $ Est ajouté à la ligne suivante.

Enfin, ajoutez une instruction print pour comparer avec la vraie valeur.

import Foundation
var sum = 0.0  //Puisque le type int et le type double ne peuvent pas être ajoutés,0.Écrivez 0 pour en faire un double type.
var x = Double.pi/2

sum += x
sum += -(x*x*x)/Double(3*2*1)

print(sum)//Valeur approximative 0.9248322292886504
print(sin(Double.pi/2))//Valeur vraie 1.0

L'expression Double (3 * 2 * 1) est utilisée pour convertir le type Int en type Doule, mais cet article n'est pas une partie essentielle, donc l'explication est omise.

3. Facilitez la généralisation

Auparavant, le deuxième terme était - (x * x * x) / 3 * 2 * 1, mais avec cela, $ x $ doit être augmenté chaque fois que le nombre de termes augmente. Ajoutez quelques idées afin de pouvoir coder court même si le nombre de termes augmente.

import Foundation
var sum = 0.0  //Puisque le type int et le type double ne peuvent pas être ajoutés,0.Écrivez 0 pour en faire un double type.
var x = Double.pi/2

sum += x

for i in 2 ..< 3{
    x *= -(x*x)/Double((2*(i-1))*(2*i-1))
    sum += x
    print(x)
}

print(sum)//Valeur approximative 0.9248322292886504
print(sin(Double.pi/2))//Valeur vraie 1.0

Nous avons utilisé «for» pour associer des termes à la variable «i». (Bien qu'il ne soit exécuté qu'une seule fois.) Dans ce cas, seul le deuxième terme est exécuté, donc for i in 2 .. <3 est défini. Bien qu'il soit généralisé, le calcul est le même, il doit donc être identique à la réponse donnée en 2.

4. Augmenter le nombre de termes

Il peut être traité en augmentant le nombre de termes en généralisant.

import Foundation
var sum = 0.0  //Puisque le type int et le type double ne peuvent pas être ajoutés,0.Écrivez 0 pour en faire un double type.
let x = Double.pi/2
var item = x

sum += item

for i in 2 ..< 6{
    item *= -(x*x)/Double((2*(i-1))*(2*i-1))
    sum += item
}

print(sum)//Valeur approximative 1.00000035425842861
print(sin(Double.pi/2))//Valeur vraie 1.0

Approximativement au sixième mandat, c'est-à-dire $ sinx= x-\frac{x^3}{3!}+\frac{x^5}{5!}-\frac{x^7}{7!}+\frac{x^9}{9!}-\frac{x^{11}}{11!} $ Ensuite, on peut voir qu'il n'y a presque pas d'erreur.

Recommended Posts

Utilisez Swift pour trouver une approximation de sinx
Trouver une approximation de cosx avec Swift
Un exemple de client API Moya + RxSwift (Swift5)
Trouvez la valeur approximative de log (1 + x) avec Swift
Exemple d'utilisation de vue.config.js
Résumé de l'utilisation de FragmentArgs
Résumé de l'utilisation de DBFlow