Bonjour à tous,
Je sollicite votre aide car je suis complètement perdue et une vraie débutante!
J'ai un projet en C++ et voici mon sujet:
On considère un câble sous tension auquel sont rigidement et régulièrement attachés des pendules. Les pendules sont couplés grâce au câble (à travers sa constante de torsion). Dans un tel système on peut observer une large gamme de phénomènes ondulatoires. Le but de cet projet est d’étudier une solution très particulière : le soliton.
Imaginons qu’une des extrémités du câble est attachée à une manivelle qui peut tourner librement. Il est alors possible de donner une impulsion au système en faisant un tour rapide ce qui déclenche la propagation d’un soliton. Dans ce projet, on considérera les pendules individuellement. Il n’est pas demandé de passer au modèle continu et de résoudre l’équation obtenue. Pour chaque pendule n, l’équation d’évolution s’écrit : d²(theta)/dt²=w0²sin(theta)-beta[theta(i+1)+theta(i-1)-theta(i)]
On résoudra cette équation pour chaque pendule. En donnant un « tour de manivelle numérique », on essayera d’obtenir la solution soliton
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90 #include <iostream> #include <fstream> #include <cmath> using namespace std; double f(double y) { return y; } double g( double theta[], int N,int i, double pas, double w0, double beta) { return -w0*w0*sin(theta[i]+pas)-beta*(theta[i+1]+theta[i-1]-theta[i]); } void RK4(double t,double theta[], double vit[], int N) { double h=0.01, tmp; double w0=1.0; double beta= 1.0; for (int i=0; i<N; i++) { double pas=0.0; double k1=g(theta,N,i,pas,w0,beta); pas= (h/2.)*k1; double k2=g(theta, N,i,pas, w0,beta); pas= (h/2.)*k2; double k3=g(theta,N,i,pas, w0,beta); pas= h*k3; double k4=g(theta, N,i,pas, w0,beta); double a=(k1+2*k2+2*k3+k4)/6.; double l1=f(vit[i]); double l2=f(vit[i]+(h/2.)*l1); double l3=f(vit[i]+(h/2.)*l2); double l4=f(vit[i]+ h*l3); double b=(l1+2*l2+2*l3+l4)/6.; theta[i]= theta[i]+h*a; vit[i] = vit[i] + h*b; } } int main () { int N,i; double t=0.,tmp=0,h=0.01; cout << "Nombre de pendules N = "; cin >> N; double theta[N], vit[N]; theta[0]=0.01; vit [0]=0; //cout << "entrer la valeur de h : "; // cin >> h; fstream w; w.open("soliton.txt",ios::out); double w0=1.0; double beta= 1.0; do { RK4(t, theta, vit ,N); w<<t << " "<< theta[i] << " "<< vit[i] << endl; } t=t+h; } while (t<2.); w.close(); return 0; }
J'ai écris ce programme jusqu'à présent (je sais bien qu'il y a énormément de soucis avec mais je ne sais pas comment faire).
J'espère que vous allez m'aider au moins à me diriger vers quelque chose qui marche!
Merci beaucoup!!
Partager