Méthode numérique
+5
remy
Gaël
Mneric
|Laurent Maquet>
°Lindsay°
9 participants
cspweb forum :: Cours :: 2ème BAC :: 2ème BAC
Page 2 sur 4
Page 2 sur 4 • 1, 2, 3, 4
Re: Méthode numérique
double g(int i,double x,const double y[]){
double G=1;
double M=1;
switch (i){
case 0:
return y[1];
break;
case 1:
return ((-G*M/(pow((sqrt (x*x+y[0]*y[0])),3.)))*x);
break;
case 2:
return y[3];
break;
case 3:
return ((-G*M/(pow((sqrt (x*x+y[0]*y[0])),3.)))*y[0]);
break;
}
}
void main(){
int p,N;
double *x;
double *y;
double *y0;
double *yf;
double t0,tf,eps;
p=4;
N=320;
y0=new double[p] ;
yf=new double [p];
t0=0.;
tf=400.;
y0[0]=10.;//x
y0[1]=-0.188;//dx/dt
y0[2]=10.;//y
y0[3]=0.;//dy/dt
eps=1.e-2;
ofstream outfile ;
outfile.open("test1.txt");
compute_yf(g,t0,tf,y0,p,eps,N,yf);
x=new double [N+1];
y=new double [p*(N+1)];
compute_yn(g,t0,tf,y0,p,N,x,y);
outfile <<"test"<<'\n'<<'\n';
for (int k=0;k<=N;k+=100){
outfile<<x[k]<<'\t'<<y[k]<<'\t'<<'\n';
}
outfile.close();
si quelqu'un peut m'aider, j'ai fait ceci pour l'équation différentielle couplée qu'il a posé l'an passé, le problème c'est que j'ai toujours les même valeurs dans mon fichier texte,...je suppose que je définis mal mes conditions initiales mais je ne vois pas comment faire,...quelqu'un gère les équadiff?
double G=1;
double M=1;
switch (i){
case 0:
return y[1];
break;
case 1:
return ((-G*M/(pow((sqrt (x*x+y[0]*y[0])),3.)))*x);
break;
case 2:
return y[3];
break;
case 3:
return ((-G*M/(pow((sqrt (x*x+y[0]*y[0])),3.)))*y[0]);
break;
}
}
void main(){
int p,N;
double *x;
double *y;
double *y0;
double *yf;
double t0,tf,eps;
p=4;
N=320;
y0=new double[p] ;
yf=new double [p];
t0=0.;
tf=400.;
y0[0]=10.;//x
y0[1]=-0.188;//dx/dt
y0[2]=10.;//y
y0[3]=0.;//dy/dt
eps=1.e-2;
ofstream outfile ;
outfile.open("test1.txt");
compute_yf(g,t0,tf,y0,p,eps,N,yf);
x=new double [N+1];
y=new double [p*(N+1)];
compute_yn(g,t0,tf,y0,p,N,x,y);
outfile <<"test"<<'\n'<<'\n';
for (int k=0;k<=N;k+=100){
outfile<<x[k]<<'\t'<<y[k]<<'\t'<<'\n';
}
outfile.close();
si quelqu'un peut m'aider, j'ai fait ceci pour l'équation différentielle couplée qu'il a posé l'an passé, le problème c'est que j'ai toujours les même valeurs dans mon fichier texte,...je suppose que je définis mal mes conditions initiales mais je ne vois pas comment faire,...quelqu'un gère les équadiff?
°Lindsay°- Etudiant en Physique
-
Nombre de messages : 165
Localisation : Namur
Date d'inscription : 14/07/2008
Re: Méthode numérique
Bon, moi j'ai un probleme avec la théorie.
Dans l'interpolation par spline cubique, slide 239, je comprends pas du tout d'ou il sort la formule avec fj(x)=Aj(x)*yj+Bj(x)*y(j+1)+Cj(x)*gj+Dj(x)*g(x+1)
avec les fonction Aj, Bj, Cj et Dj définies par après.
Si quelqun savait me dire d'ou ca vient, ca me serait bien utile.
Dans l'interpolation par spline cubique, slide 239, je comprends pas du tout d'ou il sort la formule avec fj(x)=Aj(x)*yj+Bj(x)*y(j+1)+Cj(x)*gj+Dj(x)*g(x+1)
avec les fonction Aj, Bj, Cj et Dj définies par après.
Si quelqun savait me dire d'ou ca vient, ca me serait bien utile.
Mneric- Etudiant en Physique
-
Nombre de messages : 159
Age : 34
Localisation : Soumagne
Date d'inscription : 21/06/2008
Re: Méthode numérique
Elle vient de nul part, mais on peut vérifier qu'elle marche, c'est à dire qu'en chaque point intermédiaire la fonction (ou plutôt l'assemblage de fonctions) est continue ainsi que sa dérivée 1ère et seconde -> garantit que la courbe soit bien smooth
remy- Humain
-
Nombre de messages : 106
Age : 33
Date d'inscription : 10/07/2008
Re: Méthode numérique
Ah okay...:/
Et on est sensé la connaitre par coeur alors?-_-'
Parce qu'elle n'est pas dans les slides permis malheureusement.
Et on est sensé la connaitre par coeur alors?-_-'
Parce qu'elle n'est pas dans les slides permis malheureusement.
Mneric- Etudiant en Physique
-
Nombre de messages : 159
Age : 34
Localisation : Soumagne
Date d'inscription : 21/06/2008
Re: Méthode numérique
bah faut croire... moi j'ai de gros problèmes avec la pratique et ca me broute, dans les équadiff ci dessus, si je dois en faire un graphe, je fais un graphe de x ou y en fonction de t non? et je crois qu'il veut un graphe de x et de y? je vois pas comment faire :s
et puis il y a un TP avec un f (x,y) où on doit trouver les racines de fonction de 2 variables, je calle aussi! si qqn pouvait m'aider...
et puis il y a un TP avec un f (x,y) où on doit trouver les racines de fonction de 2 variables, je calle aussi! si qqn pouvait m'aider...
°Lindsay°- Etudiant en Physique
-
Nombre de messages : 165
Localisation : Namur
Date d'inscription : 14/07/2008
Re: Méthode numérique
ouais mais bon c'est pas la mort de retenir ça non plusEt on est sensé la connaitre par coeur alors?-_-'
Je suppose que ca doit être faisable avec kaléidagraph (genre courbe paramétrique), maintenant j'en sais rien...et je crois qu'il veut un graphe de x et de y?
Comme c'est présenté, je ferais simplement boucle pour x variant comme demandé (500 valeurs de x entre -1.139 et 1.139) et à l'intérieur de la boucle, comme x est fixé, on se ramène à une fonction d'une variableTP avec un f (x,y) où on doit trouver les racines de fonction de 2 variables, je calle aussi!
remy- Humain
-
Nombre de messages : 106
Age : 33
Date d'inscription : 10/07/2008
Re: Méthode numérique
ouep, en fait ca fonctionnait pas parce que j'avais mal mis une accolade! du coup j'écrivais "return y" dasn un if et il faisait caca...j'suis sure que ca va m'arriver à l'exam
°Lindsay°- Etudiant en Physique
-
Nombre de messages : 165
Localisation : Namur
Date d'inscription : 14/07/2008
Re: Méthode numérique
maintenant, si tu dois faire le graphe tu fais un truc en 3D?
°Lindsay°- Etudiant en Physique
-
Nombre de messages : 165
Localisation : Namur
Date d'inscription : 14/07/2008
Re: Méthode numérique
Bon, j'viens de résoudre le systeme d'équa diff couplées sur lequel tu avais des problemes Lindsay.
Voici mon code :
Voila pour l'image de la trajectoire :
Voici mon code :
- Code:
#include "rungekutta.h"
#include <iostream>
#include "conio.h"
#include <math.h>
#include <fstream>
using namespace std;
double *x, *y, *yf, *Y0;
double f(int i, double x, const double y[]){
double G=1., M=1.;
switch(i){
case 0 :
return y[1];
case 2 :
return y[3];
case 1:
return -G*M*y[0]/pow(sqrt(y[0]*y[0]+y[2]*y[2]),3.);
case 3 :
return -G*M*y[2]/pow(sqrt(y[0]*y[0]+y[2]*y[2]),3.);
default:
return HUGE_VAL;
}}
void main(){
double *x, *y, *yf, *Y0;
double eps = 1.e-2;
int p=4;
int N;
yf = new double [p];
Y0 = new double [p];
Y0[0]=10.;
Y0[1]=-0.188;
Y0[2]=10.;
Y0[3]=0.188;
compute_yf(f, 0., 400., Y0, p,eps, N, yf);
x = new double [N+1];
y = new double [p*(N+1)];
compute_yn(f,0.,400.,Y0,p,N,x,y);
ofstream out;
out.open("exam3.txt");
out << "t" <<'\t'<< "x(t)"<< '\t'<< "x'(t)"<< '\t' << "y(t)"<< '\t'<< "y'(t)"<<'\n';
for(int j=0;j<=N;j++)out << x[j] << '\t'<<y[j]<<'\t'<< y[j+N+1]<<'\t'<< y[j+(N+1)*2]<<'\t'<< y[j+(N+1)*3] << '\n';
out.close();
while(!_kbhit());
delete [] x,y,yf,Y0;
}
Voila pour l'image de la trajectoire :
Mneric- Etudiant en Physique
-
Nombre de messages : 159
Age : 34
Localisation : Soumagne
Date d'inscription : 21/06/2008
Re: Méthode numérique
y[j+N+1]<<'\t'<< y[j+(N+1)*2]<<'\t'<< y[j+(N+1)*3]
tu peux m'expliquer ca? je comprend tu va rechercher ta 1, 2eme, 3eme et 4eme ligne mais je vois pas comment on pond ce truc lol j'ai essayé l'equa diff couplée d'ordre 1 dans les examet justement, je pense que mon problème (par ce que j'ai un problème non sans blague >_<) vient de mon affichage
j'pige pas ces truc de ligne lolproblème avec les N1(t) et N2(t)
j'ai fait ceci (il s'agit du problème avec les N1(t) et N2(t))
double g(int i,double t,const double y[]){
double r1=0.1;
double p1=0.01;
double p2=0.001;
double d2=0.05;
switch (i){
case 0:
return (r1*y[0]-p1*y[0]*y[1]);
break;
case 1:
return (p2*y[0]*y[1]-d2*y[1]);
break;
}
}
void main(){
int p,N;
double *x;
double *y;
double *y0;
double *yf;
double t0,tf,eps;
p=2;
N=320;
y0=new double[p] ;
yf=new double [p];
t0=0.;
tf=300.;
y0[0]=50.;
y0[1]=15.;
eps=1.e-2;
ofstream outfile ;
outfile.open("test1.txt");
compute_yf(g,t0,tf,y0,p,eps,N,yf);
x=new double [N+1];
y=new double [p*(N+1)];
compute_yn(g,t0,tf,y0,p,N,x,y);
outfile <<"test"<<'\n'<<'\n';
for (int k=0;k<=N;k++){
outfile< }
outfile.close();
delete[] x;
delete[] y;
delete[] y0;
delete[] yf;
}
tu peux m'expliquer ca? je comprend tu va rechercher ta 1, 2eme, 3eme et 4eme ligne mais je vois pas comment on pond ce truc lol j'ai essayé l'equa diff couplée d'ordre 1 dans les examet justement, je pense que mon problème (par ce que j'ai un problème non sans blague >_<) vient de mon affichage
j'pige pas ces truc de ligne lolproblème avec les N1(t) et N2(t)
j'ai fait ceci (il s'agit du problème avec les N1(t) et N2(t))
double g(int i,double t,const double y[]){
double r1=0.1;
double p1=0.01;
double p2=0.001;
double d2=0.05;
switch (i){
case 0:
return (r1*y[0]-p1*y[0]*y[1]);
break;
case 1:
return (p2*y[0]*y[1]-d2*y[1]);
break;
}
}
void main(){
int p,N;
double *x;
double *y;
double *y0;
double *yf;
double t0,tf,eps;
p=2;
N=320;
y0=new double[p] ;
yf=new double [p];
t0=0.;
tf=300.;
y0[0]=50.;
y0[1]=15.;
eps=1.e-2;
ofstream outfile ;
outfile.open("test1.txt");
compute_yf(g,t0,tf,y0,p,eps,N,yf);
x=new double [N+1];
y=new double [p*(N+1)];
compute_yn(g,t0,tf,y0,p,N,x,y);
outfile <<"test"<<'\n'<<'\n';
for (int k=0;k<=N;k++){
outfile<
outfile.close();
delete[] x;
delete[] y;
delete[] y0;
delete[] yf;
}
°Lindsay°- Etudiant en Physique
-
Nombre de messages : 165
Localisation : Namur
Date d'inscription : 14/07/2008
Re: Méthode numérique
En même temps, tu demandes au programme de rien écrire dans ton ficher à part "test" la...
Autrement j'vois pas bien ce que tu comprends pas dans mon programme.
La matrice y que tu obtiens est une matrice contenant N+1 colonnes et p lignes. Donc pour afficher la premiere ligne, tu demande qu'il t'affiche les N+1 premières valeures (de0 à N). Pour la seconde lignes, N+1 valeur suivante (de N+1 à N+1+N). Et de même avec les autres ligne.
SI ca répond pas à ta question, excuse moi.:p
Autrement j'vois pas bien ce que tu comprends pas dans mon programme.
La matrice y que tu obtiens est une matrice contenant N+1 colonnes et p lignes. Donc pour afficher la premiere ligne, tu demande qu'il t'affiche les N+1 premières valeures (de0 à N). Pour la seconde lignes, N+1 valeur suivante (de N+1 à N+1+N). Et de même avec les autres ligne.
SI ca répond pas à ta question, excuse moi.:p
Mneric- Etudiant en Physique
-
Nombre de messages : 159
Age : 34
Localisation : Soumagne
Date d'inscription : 21/06/2008
Re: Méthode numérique
oui non j'ai fini par comprendre en lisant les slides du tp sur les équations différentielles! j'suis blonde s'pour ca ^^
et je sais pas pourquoi ca l'a pas pris, mais je lui dit d'écrire ca dans le fichier :
outfile<<x[k]<<'\t'<<y[k]<<'\t'<<y[(N+1)+k]<<'\t'<<'\n';
0 50 15
75 137284 -12928.2
150 5.37121e+060 -5.37121e+059
225 1.#INF -1.#IND
300 -1.#IND -1.#IND
et voila ce que je récolte! et je comprend pas vraiment pourquoi ...
et je sais pas pourquoi ca l'a pas pris, mais je lui dit d'écrire ca dans le fichier :
outfile<<x[k]<<'\t'<<y[k]<<'\t'<<y[(N+1)+k]<<'\t'<<'\n';
0 50 15
75 137284 -12928.2
150 5.37121e+060 -5.37121e+059
225 1.#INF -1.#IND
300 -1.#IND -1.#IND
et voila ce que je récolte! et je comprend pas vraiment pourquoi ...
°Lindsay°- Etudiant en Physique
-
Nombre de messages : 165
Localisation : Namur
Date d'inscription : 14/07/2008
Re: Méthode numérique
J'ai fait le truc des dés
le main
la fonction dice dans dice.cpp
et ce que ca donne
le main
- Code:
#include <iostream>
#include "dice.h"
#include <fstream>
using namespace std;
int main()
{
ofstream f;
f.open("des1.txt");
srand(time(NULL));
int N = 3;
int* n= new int[N];
n[0] = 2;
n[1] = 3;
n[2] = 17;
int somme = 0;
for (int k=0 ; k<N ; k++){
int* compteur1 = new int[6*n[k]+1];
int* compteur2 = new int[6*n[k]+1];
for (int j=0 ; j<6*n[k]+1 ; j++){
compteur1[j]=0;
compteur2[j]=0;
}
for (int i=0 ; i<100000; i++){
somme = 0;
for (int j=0 ; j<n[k] ; j++){
somme+=dice(1,6);
}
// cout << somme<<" ";
compteur1[somme]++;
compteur2[dice(n[k],6*n[k])]++;
}
for (int j=0 ; j<6*n[k] ; j++){
cout << j+1 << " : "<< compteur1[j+1] << " <> "<<compteur2[j+1] << endl;
f << j+1 << " "<< compteur1[j+1] << " "<<compteur2[j+1] << endl;
}
cout << endl << endl;
f << endl << endl;
delete[] compteur1,compteur2;
}
f.close();
f.open("des2.txt");
int min,indiceMin;
int* resultats4 = new int[4];
int* compteur1 = new int[6*3+1];
int* compteur2 = new int[6*3+1];
for (int j=0 ; j<6*3+1 ; j++){
compteur1[j]=0;
compteur2[j]=0;
}
for (int i=0 ; i<100000; i++){
somme = 0;
for (int j=0 ; j<3 ; j++){
somme+=dice(1,6);
}
compteur1[somme]++;
min = 6;
for (int j=0 ; j<4 ; j++){
resultats4[j]=dice(1,6);
if(resultats4[j]<min){
min = resultats4[j];
indiceMin = j;
}
}
somme = 0;
for (int j=0 ; j<4 ; j++){
if (j != indiceMin){
somme+=resultats4[j];
}
}
compteur2[somme]++;
}
for (int j=0 ; j<6*3 ; j++){
cout << j+1 << " : "<< compteur1[j+1] << " <> "<<compteur2[j+1] << endl;
f << j+1 << " "<< compteur1[j+1] << " "<<compteur2[j+1] << endl;
}
delete[] compteur1,compteur2;
f.close();
}
la fonction dice dans dice.cpp
- Code:
int dice (int m, int n){
return rand()%(n+1-m)+m;
}
et ce que ca donne
bah comme ca c'est difficile de touver ce qui coince, je sais pas t'aiderje comprend pas vraiment pourquoi
Dernière édition par remy le Mer 20 Jan - 15:39, édité 1 fois
remy- Humain
-
Nombre de messages : 106
Age : 33
Date d'inscription : 10/07/2008
Re: Méthode numérique
ben si quelqu'un tente l'equa diff d'ordre 1 et trouve une solution je la veux bien car moi non plus je vois pas ce qui coince ^^
°Lindsay°- Etudiant en Physique
-
Nombre de messages : 165
Localisation : Namur
Date d'inscription : 14/07/2008
Re: Méthode numérique
je l'essayerai mais plutôt demain qu'aujourd'hui je pense
Thibaut V.- Vertébré
-
Nombre de messages : 41
Age : 35
Localisation : Bastogne
Date d'inscription : 06/01/2010
Re: Méthode numérique
rha moi j'me sens plus la ^^ j'vais tous les tenter, ce soir, et demain ^^ j'suis une moule, il faut que je vainque (bordel comment on écrit "vainque" ôÔ soit ^^) ce problème avant jeudi matin
et j'ai envoyé un mail à Jérémie, il y a un TP avec une fonction de x et y, c'est pas y-a mais y+a dans l'énoncé...et sa réponse "ah oui y'a une erreur, je changerai pour l'année prochaine...toute façon c'était un exam de seconde sess' et personne n'était arrivé au bout" xD y'en a qui ont dû se prendre la tête à cause d'une erreur dans l'énoncé >_< lol
et j'ai envoyé un mail à Jérémie, il y a un TP avec une fonction de x et y, c'est pas y-a mais y+a dans l'énoncé...et sa réponse "ah oui y'a une erreur, je changerai pour l'année prochaine...toute façon c'était un exam de seconde sess' et personne n'était arrivé au bout" xD y'en a qui ont dû se prendre la tête à cause d'une erreur dans l'énoncé >_< lol
°Lindsay°- Etudiant en Physique
-
Nombre de messages : 165
Localisation : Namur
Date d'inscription : 14/07/2008
Re: Méthode numérique
ca yest, ca marche, ce truc, mais je le signal à tout le monde, jérémie m'a dit pour ce problème que les équations étaient assez sensibles aux conditions initiales...il faut mettre N=64 de base dans le compute_yf, c'était pour ça que ca ne marchait pas! je comprend pas torp pourquoi mais visiblement ce genre d'équations est en fait complexe d'après ses dires ^^
°Lindsay°- Etudiant en Physique
-
Nombre de messages : 165
Localisation : Namur
Date d'inscription : 14/07/2008
Re: Méthode numérique
je confirme, en le faisant de mon côté j'arrive aussi à
0 50 15
75 137284 -12928.2
150 5.37121e+60 -5.37121e+59
225 inf nan
300 nan nan
mais en mettant 64 pour le N au départ, ca marche (avec 16 aussi, mais pas plus bas)
0 50 15
75 137284 -12928.2
150 5.37121e+60 -5.37121e+59
225 inf nan
300 nan nan
mais en mettant 64 pour le N au départ, ca marche (avec 16 aussi, mais pas plus bas)
remy- Humain
-
Nombre de messages : 106
Age : 33
Date d'inscription : 10/07/2008
Re: Méthode numérique
d'après jérémie c'est parce que si une fonction a une pente trop importante au départ bah ca foire pour les grandes valeurs (un problème de convergence ^^) mais il ma dit que ça, c'était avec l'expérience qu'on le devinait ^^ donc voila maintenant on le sait!
°Lindsay°- Etudiant en Physique
-
Nombre de messages : 165
Localisation : Namur
Date d'inscription : 14/07/2008
Re: Méthode numérique
un truc, dans les questions d'exam après avoir résolu une équadiff il faut notamment interpoler la solution (y'en a un par exemple où on doit faire un graphique entre 0 et 60s et interpoler de 0 à 30s) qu'est ce que vous écrivez comme dimension pour aller rechercher dans le fichier où vous avez créé les nombres?
EDIT: je ne vois toujours pas comment faire ce qui est écrit juste au dessus et j'aurais besoin d'un programme d'interpolation au point ^^ jep ense que le mien a quelques lacunes :/
EDIT: je ne vois toujours pas comment faire ce qui est écrit juste au dessus et j'aurais besoin d'un programme d'interpolation au point ^^ jep ense que le mien a quelques lacunes :/
°Lindsay°- Etudiant en Physique
-
Nombre de messages : 165
Localisation : Namur
Date d'inscription : 14/07/2008
Re: Méthode numérique
Quequ'un aurait-il une solution pour pourvoir interpoler à partir d'un dossier de nombres que l'on a écrit en calculant une équation différentielle?
je calle là dessus depuis ce matin ca me prend la tête (notamment un examen comme ci dessus où on calcule 300valeurs et il ne faut en interpoler que 100 pitié je meurs >-<)
je calle là dessus depuis ce matin ca me prend la tête (notamment un examen comme ci dessus où on calcule 300valeurs et il ne faut en interpoler que 100 pitié je meurs >-<)
°Lindsay°- Etudiant en Physique
-
Nombre de messages : 165
Localisation : Namur
Date d'inscription : 14/07/2008
Re: Méthode numérique
Petit truc, Gaël tu disais qu'il fallait pas stresser pour l'interpolation polynomiale... ils l'vaient pas vue non plus l'an passé en fait, j'viens d'envoyer un mail à jérémie, du coup...bah faut qu'on essaye de faire le truc avec la matrice des coefficients!
°Lindsay°- Etudiant en Physique
-
Nombre de messages : 165
Localisation : Namur
Date d'inscription : 14/07/2008
Re: Méthode numérique
tu parles du phys_janv_09_1?
Thibaut V.- Vertébré
-
Nombre de messages : 41
Age : 35
Localisation : Bastogne
Date d'inscription : 06/01/2010
Re: Méthode numérique
oui ca...qui en fait, n'est pas vraiment de l'interpolation polynomiale (merci floriane ^^)
mais je me posais une question, avec floriane, on a rentré les valeurs des xi a la main, y'a pas moyen d'aller les rechercher dans un fichier data et d'en prendre les puissances?
mais je me posais une question, avec floriane, on a rentré les valeurs des xi a la main, y'a pas moyen d'aller les rechercher dans un fichier data et d'en prendre les puissances?
°Lindsay°- Etudiant en Physique
-
Nombre de messages : 165
Localisation : Namur
Date d'inscription : 14/07/2008
Re: Méthode numérique
Merci Floriane qui dit merci Thibaut XD.
Bien sûr que c'est possible! Mais je dirais aussi : c'est pas demandé
Bien sûr que c'est possible! Mais je dirais aussi : c'est pas demandé
Thibaut V.- Vertébré
-
Nombre de messages : 41
Age : 35
Localisation : Bastogne
Date d'inscription : 06/01/2010
Page 2 sur 4 • 1, 2, 3, 4
cspweb forum :: Cours :: 2ème BAC :: 2ème BAC
Page 2 sur 4
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum
|
|