begin process at 2012 05 28 14:00:43
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C++ & C++ .NET

 > 

Algorithme

 > 

Maths

 > 

Besoin d'aide c++


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

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&#8217;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&#8217;½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 :

F=h*ones(N,1)

->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 ?

S=linsolve(k,-T)



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&#8217;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++

sevio14

ceux sont des matrices
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


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,373 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales