Buonasera a tutti, premetto che sono uno studente che ha esperienza con c++ solo per la preparazione di un esame (fatto 2 anni fa), comunque, ho creato questo codice che risolve un sistema di equazioni non lineari col metodo Newton rapshon.
Il problema sta nel doppio ciclo.
fi2 è un angolo che va da 0 a 359, fi3 e fi4 angoli che variano in funzione di fi2.
praticamente il programma conta e incrementa fi2 fino a a 55 e trova dei valori di altri angoli che ho constatato essere corretti (i risultati li salvo su un array bidimensionale e li stampo su file .txt), ma da fi2=56 sul file leggo che fi2 si annulla e lo stesso fi3 e fi4, da fi2=141 il programma mi stampa normalmente fi2 ma mi da valori completamente sbagliati (tipo non inizializzati) per fi3 e fi4.
Sapreste trovarmi il problema per favore? grazie
il programma è questo:
const int N=6;
const int M=360;
#include <iostream>
#define _USE_MATH_DEFINES
#include <math.h>
#include <fstream>
#include<stdlib.h>
#include<stdio.h>
using namespace std;
double seno (double a)
{
double ris;
double pigreco=3.141590;
a= (a*pigreco)/180.0000;
ris = sin(a) ; //calcolo in RADIANTI
return ris;
}
double coseno (double b)
{
double risu;
double pigreco=3.141590;
b= (b*pigreco)/180.0000;
risu = cos(b) ; //calcolo in RADIANTI
return risu;
}
int main()
{
double l1= 6.0, l2=2.0, l3=4.5, l4=6.5; //misure quadrilatero l1: telaio, l2: manovella
double fi2=-1.0000, w2o= 100.0000 *57.3,w2, w3, w4; ////rotazioni v angolari e acc angolari
double delta=0.0050, e=0.0050,c1,c2, k=0.0100;
double senfi2, senfi3, senfi4, cosfi2, cosfi3, cosfi4;
int i,j; //m: variazioni, i:incrmeento angolo
double ,f2; //eq chiusura
double fi3=-70.0000, fi4= 40.0000; //coordinate iniziali
double fi3n,fi4n; //vettore soluzioni
double Config[N][M]; //vettore salvataggio configurazione
senfi3 = seno(fi3);
senfi4 = seno(fi4);
cosfi3 = coseno(fi3);
cosfi4 = coseno(fi4);
for(j=0; j<360; j++)
{
fi2 = fi2+1.000;
senfi2 = seno(fi2);
cosfi2 = coseno(fi2);
w2 = w2o*(1+k*senfi2);
for(i=0;i<200;i++)
{
fi3n = fi3 - ((senfi3*cosfi4*(-l1+l2*cosfi2+l3*cosfi3+l4*cosfi4)-cosfi3*senfi4*(l2*senfi2+l3*senfi3+l4*senfi4))/(cosfi3*senfi4-senfi3*cosfi4));
fi4n = fi4 - ((-cosfi3*senfi4*(-l1+l2*cosfi2+l3*cosfi3+l4*cosfi4)-senfi3*cosfi4*(l2*senfi2+l3*senfi3+l4*senfi4))/(cosfi3*senfi4-senfi3*cosfi4));
senfi3 = seno(fi3n); //nuovi valori di sen e cos con i valori trovati dal metodo della tg
senfi4 = seno(fi4n);
cosfi3 = coseno(fi3n);
cosfi4 = coseno(fi4n);
= -l1+(l2*cosfi2)+(l3*cosfi3)+ (l4*cosfi4); //nuovo valore equazioni di chiusura
f2 = (l2*senfi2)+(l3*senfi3)+(l4*senfi4);
if(f1<0) //devo avere sempre le eq di chiusura positive per confrontarle con epsilon
=fabs(f1);
if(f2<0)
f2=fabs(f2);
if(fi3n-fi3<0)
c1 = fabs(fi3n-fi3);
if(fi4n-fi4<0) //devo avere la diff da Pn e Pn-1 sempre maggiore di 0 per confrontarla con delta
c2 = fabs(fi4n-fi4);
if (f1<=e and f2<=e and c1<=delta and c2<=delta)
{
w3 = ((-l2*cosfi2*w2)/(l3*cosfi3)+(l2*cosfi4*senfi2*w2)/(l3*cosfi3*senfi3))*(1/(1-(cosfi4*senfi3)/(cosfi3*senfi4)));
w4 = (-l2*cosfi2*w2-l3*senfi3*w3)/(l4*senfi4);
fi3n= (fi3n-360)*(-1);
fi4n=(fi4n+360)*(-1);
cout<< " Configurazione: "<< endl;
cout << " fi2 = " << fi2 <<", fi3 = " << fi3n << ", fi4 = " << fi4n<< endl;
cout << " w3= " << w3 << ", w4 = " << w4 << endl;
Config[0][j]=fi2;
Config[1][j]=fi3n;
Config[2][j]=fi4n;
Config[3][j]=w2;
Config[4][j]=w3;
Config[5][j]=w4;
i=1001;
}
else
{
fi3= fi3n;
fi4= fi4n;
senfi3 = seno(fi3);
cosfi3 = coseno(fi3);
senfi4 = seno(fi4);
cosfi4 = coseno(fi4);
}
}
}
for(j=0;j<360; j++)
{
ofstream f("x grafico.txt", ios::app);
if(!f)
{
cout<<"Errore nell'apertura del file!";
return -1;
}
f <<"FI2: "<< Config[0][j]<<endl;
f<< "FI3: "<< Config[1][j]<<endl;
f<< "FI4: "<< Config[2][j]<<endl;
f<< "W2: " << Config[3][j] <<endl;
f<< "W3: " << Config[4][j]<<endl;
f<< "W4: " << Config[5][j]<<endl ;
f<<" "<<endl;
f.close();
}
return 0;
}