Accueil > Forum > > > > Besoin d'aide c++
Besoin d'aide c++
mercredi 2 mars 2011 à 18:36:27 |
Besoin d'aide c++

sevio14
|
Quelqu'un peut-il m'aider à faire le programme de l'algorithme d'uzawa?
Voici ce que j'ai commencé à définir:
#include <iostream>
#include <istream>
#include <math.h>
#include <stdlib.h>
#include <stdio.h>
using namespace std;
#define N 4
typedef double Vecteur[N];
typedef double Matrice[N][N];
// A rendre avant 7 mars avant midi
double norme(Vecteur V){
double somme=0.0;
double norm=0.0;
for(int i=0 ; i<N ; i++){
if(V[i]==0){
norm=0.0;
}
else{
somme+=V[i]*V[i];
norm=sqrt(somme);
}
}
return norm;
}
double ValAbs(double x){
if(x>0)
return x;
else
return -x;
}
void remplir_mat(Matrice A) {
for (int i=0;i<N;i++){
for (int j=0;j<N;j++){
cout<<"Entrez la composante a["<<i<<"]["<<j<<"]"<<endl;
cin>>A[i][j];
}
}
}
void remplir_vec(Vecteur b) {
for (int i=0 ; i<N ; i++){
cout<<"Entrez la composante ["<<i<<"]"<<endl;
cin>>b[i];
}
}
void affiche_vec(Vecteur b) {
for (int i=0;i<N;i++){
cout<<"["<<i<<"]"<<b[i]<<endl;
}
}
void affiche_mat(Matrice A) {
for (int i=0;i<N;i++){
cout<<"[";
for (int j=0;j<N;j++){
cout<<" "<<A[i][j]<<" ";
}
cout<<"]"<<endl;
}
}
void transp_mat(Matrice ent,Matrice sort){
for(int i=0;i<N;i++){
for(int j=0;j<N;j++){
sort[i][j]=ent[j][i];
}
}
}
void multipier_mat(Matrice ma, Matrice mb, Matrice mprod){
for(int i=0;i<N;i++){
for(int j=0;j<N;j++){
for(int k=0;k<N;k++){
mprod[i][j]=mprod[i][j]+ma[i][k]*mb[k][j];
}
}
}
}
void prod_mat_vect(Matrice A, Vecteur B, Vecteur result){
for (int i=0;i<N;i++){
result[i]=0;
for (int j=0;j<N;j++){
result[i]=result[i]+A[i][j]*B[j];
}
}
}
double prod_scal(Vecteur vect1, Vecteur vect2){
double result=0;
for (int i=0;i<N;i++){
result=result+vect1[i]*vect2[i];
}
return result;
}
double max_tab(Vecteur tab,int n){
double nmax;
nmax = tab[0];
for(int j=0; j<n; j++){
if(tab[j]>nmax)
nmax=tab[j];
}
return nmax;
}
void gradient_conjugue(Matrice A, Vecteur b,Vecteur x,double eps){
int m=0;
Vecteur a;
Vecteur r;
Vecteur d,Ax;
double rh,rho,rho1,lambda;
bool boolean=true;
double test=pow(eps,2);
for(int i=0; i<N; i++){
x[i]=0.;
}
for(int i=0; i<N; i++){
r[i]=0.;
}
for(int i=0; i<N; i++){
a[i]=0.;
}
for(int i=0; i<N; i++){
r[i]=b[i];
}
for(int i=0 ; i<N ; i++){
d[i]=r[i];
}
rh=prod_scal(r,r);
if (rh<=test){
boolean=false;
}
while(boolean == true){
m=m+1;
prod_mat_vect(A,d,a);
rho=rh/(prod_scal(d,a));
for(int i=0;i<N;i++){
x[i]=x[i]+rho*d[i];
}
for(int i=0;i<N;i++){
r[i]=r[i]-rho*a[i];
}
rho1=prod_scal(r,r);
lambda=rho1/rh;
rh=rho1;
for(int i=0;i<N;i++){
d[i]=r[i]+lambda*d[i];
}
if (rh<=test){
boolean=false;
}
}
}
void mat_A(Matrice A){
for(int i=1 ; i <= N ; i++){
for(int j=1 ; j <= N ; j++){
if(j==i)
A[i][j]=2*(N-1);
if(j==i+1)
A[i][j]=-1*(N-1);
if(j==i-1)
A[i][j]=-1*(N-1);
else
A[i][j]=0.0;
}
}
}
void vect_F(Vecteur F){
for(int i=0;i<N;i++){
F[i]=1/(N-1);;
}
}
void mat_B(Matrice B){
for(int i=0; i<2;i++){
for(int j=0; j<N; j++){
if((i==1 && j==1) || (i==2 && j==2)){
B[i][j]=1;
}
if((i==1 && j==N) || (i==2 && j==N-1)){
B[i][j]=-1;
}
else{
B[i][j]=0.0;
}
}
}
}
main(){
Matrice A;
for(int i=1 ; i <= N ; i++){
for(int j=1 ; j <= N ; j++){
if(j==i)
A[i][j]=2*(N-1);
if(j==i+1)
A[i][j]=-1*(N-1);
if(j==i-1)
A[i][j]=-1*(N-1);
else
A[i][j]=0.0;
}
}
}
main()
{
cout<<"------------------------------------------------------------------------"<<endl;
cout<<"----------------------METHODE D'UZAWA---------------------------------- "<<endl;
cout<<"-------------------------------------------------------------------------"<<endl;
//déclaration des variables
}
|
|
mercredi 2 mars 2011 à 21:46:52 |
Re : Besoin d'aide c++

pop70
|
Voici les premiers changements effectués :
Code C/C++ : #include <iostream>
#include <math.h> // Ici j'ai enlevé les librairies inutiles
#define N 4
typedef double Vecteur[N];
typedef double Matrice[N][N];
/* Là j'enlève le "using namespace std",
il faut mettre "std::" devant tous les cin, cout et endl ; c'est mieux
*/
double norme(Vecteur V)
{
//...
int main()
{
Matrice A;
for (int i=1 ; i < N ; i++) // juste < N et pas <= N
{
/* idem, sinon le programme se crash en tentant d’accéder à des éléments qui ne sont pas alloués : */
for (int j=1 ; j < N ; j++)
{
if (j==i)
A[i][j]=2*(N-1);
else if (j==i+1) /*Ici je change les "if" en "else if", c'est plus sûr,
car si j ou i venait à être modifié dans la condition précédente,
celle-ci ou une autre risquerait de s'executer aussi.
De plus le else à la fin ne s'appliquait avant qu'au "if" le précédent,
et je suis pas convaincu que se soit ce que tu veuilles faire. */
A[i][j]=-1*(N-1);
else if (j==i-1)
A[i][j]=-1*(N-1);
else
A[i][j]=0.0;
}
}
// Là comme il n'y a plus using namespace on rajoute les std::
std::cout<<"------------------------------------------------------------------------"<<std::endl;
std::cout<<"----------------------METHODE D'UZAWA---------------------------------- "<<std::endl;
std::cout<<"-------------------------------------------------------------------------"<<std::endl;
}
Pour le using namespace, tu peux aller jeter un coup d’½il ici, c'est le site de CptPingu, son article est vraiment bien et explique plein de choses.
Bonne chance,
Pop70
|
|
jeudi 3 mars 2011 à 08:45:53 |
Re : Besoin d'aide c++

sevio14
|
J'ai fait le programme sur scilab et je voudrai le réécrire en c++:
N=4;
h = (1/(N-1));
A = zeros(N,N);
for i = 1:N
for j = 1:N
if (j==i) then
A(i,j)=2;
end
if (j== i+1) then A(i,j)=-1; end
if (j== i-1) then A(i,j)=-1; end
end;
end;
disp ('afficher la matrice', A);
A = (1/h)*A;
F=h*ones(N,1)
B=zeros(2,N);
B(1,1)=1;
B(2,2)=1;
B(1,N)=-1;
B(2,N-1)=-1;
T=zeros(1,N+2);
k=zeros(N+2,N+2);
k=[A,B';B,[0 0;0 0]]
T=[F;0;0]
S=linsolve(k,-T)
rho=10^(-3);
eps=10^(-6);
u=rand(zeros(N,1));
p=rand(zeros(2,1));
nmax=10000
function[p1,u1,n]=Uzawa(u,p,A,B,F,nmax,eps,rho)
p1=p;
for n=1:nmax
d=F-B'*p1;
u=inv (A)*d;
p2=p1+rho*B*u;
if (norm(p2-p1))<eps then
return
end
p1=p2
end
u1=u
endfunction
[p1,u1,n]=Uzawa(u,p,A,B,F,nmax,eps,rho);
mprintf('la solution 1 est \n')
p1
mprintf('la solution 2 est \n')
u1
|
|
jeudi 3 mars 2011 à 11:23:15 |
Re : Besoin d'aide c++

pop70
|
Je connais pas le scilab, donc pour traduire ça en C++ ça va à peu près sauf à des endroits comme :
->Ca veut dire "faire un tableau de taille [N * h ; 1]" qu'on remplit de 1, ou faire un tableau de taille [N; 1] qu'on remplit de 1 * h ?
-Que doit faire la fonction linsolve ?
et aussi à quoi doivent ressembler les matrices k et T quand on les déclare comme ça ?
k=[A,B';B,[0 0;0 0]]
T=[F;0;0]
genre T = F en [0;0] ?
Voila, sinon le reste c’est bon, il me manque juste ça pour pouvoir te donner une traduction à peu près correcte.
C++dialement,
Pop70
|
|
jeudi 3 mars 2011 à 14:14:33 |
Re : Besoin d'aide c++

sevio14
|
F c'est un vecteur:
F =
0.25
0.25
0.25
0.25
0.25
S =
0.15625
0.25
0.28125
0.25
0.15625
- 5.126D-16
2.951D-16
k =
8. - 4. 0. 0. 0. 1. 0.
- 4. 8. - 4. 0. 0. 0. 1.
0. - 4. 8. - 4. 0. 0. 0.
0. 0. - 4. 8. - 4. 0. - 1.
0. 0. 0. - 4. 8. - 1. 0.
1. 0. 0. 0. - 1. 0. 0.
0. 1. 0. - 1. 0. 0. 0.
T =
0.25
0.25
0.25
0.25
0.25
0.
0.
|
|
jeudi 3 mars 2011 à 14:17:11 |
Re : Besoin d'aide c++
|
jeudi 3 mars 2011 à 16:21:26 |
Re : Besoin d'aide c++

pop70
|
Voilà, pour ma part je ne pourrait pas en faire plus, y'a encore plein de trucs que j'ai pas compris sur le scilab, mais bon voilà quand même un début.
Le code C++ est changé ligne par ligne, j'ai laissé le code de départ en commentaire en vert, à coté.
Code C/C++ : #include <iostream>
#include <math.h>
int main (int argc,char **argv)
{
const int N=4; // N = 4;
double h = (1/(N-1)); // h = (1/(N-1)) soit 1/3;
double A[N][N] = {0}; // A = zeros(N,N);
for (int i = 0; i < N; i++ ) //for i = 1:N
{
for (int j = 0; j < N; j++) //for j = 1:N
{
if (j == i) //if (j==i) then
{
A[i][j] = 2; // A(i,j)=2;
} //end
else if (j == (i+1)) // if (j== i+1)
{
A[i][j] = - 1; //then A(i,j)=-1; end
}
else if (j == (i-1)) //if (j== i-1)
{
A[i][j] = -1; // then A(i,j)=-1; end
}
} //end;
}//end;
//******disp ('afficher la matrice', A); ******/
std::cout << "`\nMatrice A : \n";
for (int y = 0; y < N; y++)
{
for (int x = 0; x < N; x++)
{
std::cout << A[x][y] << " - ";
}
std::cout << std::endl;
}
//********************************************/
//***** A = (1/h)*A ; *****/
for (int y = 0; y < N; y++)
{
for (int x = 0; x < N; x++)
{
A[x][y] *= (1/h);
}
}
//***************************/
double F[N] = {h}; //F=h*ones(N,1)
double B[2][N] = {0}; //B=zeros(2,N);
B[0][0] = 1; //B(1,1)=1;
B[1][1] =1; //B(2,2)=1;
B[0][N - 1] = -1; //B(1,N)=-1;
B[1][N-2] = -1; //B(2,N-1)=-1;
double T[N+1] = {0}; //T=zeros(1,N+2);
double k[N+2][N+2] = {0}; //k=zeros(N+2,N+2);
// ? // k=[A,B';B,[0 0;0 0]]
//*****T=[F;0;0]*****/
for (int z = 0; z < N - 2; z ++)
{
T[z] = h;
}
//*********************/
// ? // S=linsolve(k,-T)
double rho = pow(10,-3); //rho=10^(-3);
double eps = pow(10, -6); //eps=10^(-6);
double u[N] = {rand()}; // u=rand(zeros(N,1));
double p[2] = {rand()}; // p=rand(zeros(2,1));
int nmmax = 10000; //nmax=10000
// ? // function[p1,u1,n]=Uzawa(u,p,A,B,F,nmax,eps,rho)
//******p1=p;*****/
double p1[2];
for (int z = 0; z < N;z++)
{
p1[z] = p[z];
}
//********/
for (int n = 1; n < nmmax; n++) //for n=1:nmax
{
double d[N];
//*****d=F-B'*p1; ***/
for (int z = 0; z < N; z++)
{
d[z] = F[z] - B[0][z]; // ?
}
//*******************/
//********u=inv (A)*d;*****/
for (int z = 0; z < N; z++)
{
u[z] = (1 / (A[z][z])) * d[z]; // ?
}
//**************************/
double p2[2];
//******p2=p1+rho*B*u;****/
for (int z = 0; z < 2; z++)
{
p2[z] = p1[z] + rho * B[0][z] * u[z];
}
//***************/
if (sizeof(p2) - sizeof(p1) < eps) //if (norm(p2-p1))<eps then
{
return 0; //return
} //end
//******p1=p2;*****/
double p1[2];
for (int z = 0; z < N;z++)
{
p1[z] = p2[z];
}
//********/
}//end
//*****u1=u****/
double u1[N];
for (int z = 0; z < N;z++)
{
u1[z] = u[z];
}
//*******/
//endfunction
//[p1,u1,n]=Uzawa(u,p,A,B,F,nmax,eps,rho); ?
std::cout << "La solution 1 est p1" << p1 << "\n"; //mprintf('la solution 1 est \n') p1
std::cout << "La solution 2 est p1" << u1 << "\n"; //mprintf('la solution 2 est \n') u1
return 0;
}
Y'a sûrement des calculs qui sont pas bon, mais après c'est juste histoire de modifier "qu'est-ce qu'on calcul avec quoi"...
Sinon y'a des fonctions comme Uzawa() qu'y n'ont pas d'équivalent direct, même dans l'espace standard <algorithm>.
Y va falloir la ré-implémenter totalement je pense.
Bonne chance et bon courage !
C++dialement,
Pop70
|
|
mardi 8 mars 2011 à 08:55:43 |
Re : Besoin d'aide c++

louis14
|
Bonjour,
Il faut télécharger les sources de Scilab pour obtenir le code des fonctions particulières ou au moins s'en inspirer.
louis
|
|
Cette discussion est classée dans : int, for, double, vecteur, if
Répondre à ce message
Sujets en rapport avec ce message
Segmentation Fault....en traitement d'image [ par psysta ]
Bonjour,je suis nouveau dans la programmation en C. J'ai un programme Matlab qui marche bien, et je souhaiterais l'implémenter en C. Le pgm compile bi
allocation dynamique [ par CeNedra83 ]
je code en C++ en je ne comprend pas un truc: ma fonction marchait très bien et maintenant elle se met à planter une fois sur 2 pour cause d'allocatio
ce code ne marche pas?????????? [ par banak3181 ]
s'il vous plait les gars je veux que quelqu'un me disent pourquoi ce code ne marche sur dev C++:#include #include #include #include # include<myconio.
Probleme : Sudoku en C [ par seth59222 ]
Bonsoir, voila je suis actuellement en première année d'info, donc assez novice et je viens de créer ce petit bout de programme en C qui consiste a ré
Programme en c++ [ par noussa44 ]
Bonjour à tous et merci d'avance pour vos réponses, J'ai fait un petit code en c++ pou calculer la distance entre des points avec la formule :d² = (x'
j'ai besoin de vous!!! [ par baster200x ]
bonjour les amis [^^happy13] j'ai trouvé la solution pour mes problème que je l'ai poser précédemment sur le forum à propos de l'intégration d'u
problème d'intégrer mon algorithme [ par baster200x ]
Slt tous le mande! je vous adresse pour m'aider à trouver une solution à mon problème! j'ai un outil Open source Nommé [url=http://home.dei.polimi
Problème générateur de grille de sudoku en C [ par Dovah ]
Bonjour, je suis débutant en programmation, et pour m'entraîner j'ai décidé de créer un programme qui génère aléatoirement une grille de sudoku en C
erreur c [ par maha1987 ]
Bonjour tout le monde, j'ai ce programme C qui prend des caractères et doit afficher si la chaîne constituée par ces caractères est valide(constituée
besoin d'aide dans programme en c [ par houda986 ]
salut; je suis un débutante en programmation et j'ai besoin d'aide pour la résolution d'un programme en C,c'est un programme de tri par base ... j'ai
Livres en rapport
|
Derniers Blogs
IMAGINE CUP 2012, MAKE A SIGN EN FINALEIMAGINE CUP 2012, MAKE A SIGN EN FINALE par junarnoalg
Voilà qui est fait, la nouvelle est officielle ! L'équipe belge "Make a Sign" va au pays des kangourous défendre son projet dans la catégorie Software Design. http://www.imaginecup.com/CompetitionsContent/Competition/WorldwideFinalists.aspx V...
Cliquez pour lire la suite de l'article par junarnoalg KINECT 1.5 IS OUT !KINECT 1.5 IS OUT ! par Vko
La version 1.5 du Kinect For Microsoft vient tout juste de sortir ! Plein de nouveautés: Tracking de squelette en Near Mode Détection en position assise Détection faciale avec un SDK dédié Documentation et des guideline (enfin) Un out...
Cliquez pour lire la suite de l'article par Vko LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) par richardc
Mise à jour des Web API du 14 Mai
Réservez dès maintenant votre journée du 20 juin pour le Windows Azure Dev Camp 2012 à Paris
Mise à jour de Team Foundation Service
MechCommander 2 sur Windows 8
Entity Framework 5 Release Candidate e...
Cliquez pour lire la suite de l'article par richardc REACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITERREACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITER par Groc
Une mauvaise utilisation de rx lors de l'écriture d'une couche d'accès à des services peut conduire à des cas embarassants avec des erreurs mal gérées, des appels qui ne partent lorsqu'ils le devraient, et même des résultats incorrects . le tout nuis...
Cliquez pour lire la suite de l'article par Groc SHAREPOINT BLOG SITE, PROBLèME D'ARCHIVESSHAREPOINT BLOG SITE, PROBLèME D'ARCHIVES par junarnoalg
Dernièrement, nous avons migré le site
myTIC
vers un nouveau serveur SharePoint 2010. Dans les contenus que nous vouloins récupérer, nous avions un certain nombre de blogs.
Nous avons utilisé les commandes Power...
Cliquez pour lire la suite de l'article par junarnoalg
Logiciels
sDEVIS-FACTURES vlPRO (8.1.0.3)SDEVIS-FACTURES VLPRO (8.1.0.3)sDEVIS-FACTURES vlPRO a été mis au point pour les particuliers, créateurs, entrepreneurs, artisa... Cliquez pour télécharger sDEVIS-FACTURES vlPRO 974 Application Server (12.2.4.6)974 APPLICATION SERVER (12.2.4.6)Développez de puissantes applications dans un environnement de 'cloud computing', clusterisé, séc... Cliquez pour télécharger 974 Application Server vPicture (1.4.2.1)VPICTURE (1.4.2.1)Avec vPicture, hébergez vos images facilement et rapidement.
vPicture est un utilitaire simple, ... Cliquez pour télécharger vPicture Easy-Planning (2.2.1.6)EASY-PLANNING (2.2.1.6)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté au... Cliquez pour télécharger Easy-Planning COM-BACKUP (2.0)COM-BACKUP (2.0)
COM-BACKUP est un logiciel de sauvegarde qui permet de planifier les sauvegardes de vos dossiers ...
Cliquez pour télécharger COM-BACKUP
|