Testo;
Si deve scrivere un programma chiamato molla.c per calcolare numericamente l’andamento temporale
di x(t), in particolare il programma dovrà:
1. Chiedere in input la costante elastica della molla k (in N/m), la massa m (in kg), a e xmax,
verificando che k, m e xmax siano grandezze positive.
2. Calcolare il periodo Thar valido per piccole oscillazioni e stamparlo con 5 cifre dopo la virgola.
Thar = 2*p*sqrt(m/k)
3. Calcolare e stampare in notazione scientifica il passo temporale ?t utilizzando la seguente
formula:
?t =Thar/(2^20)
4. Inizializzare t, x e v (ovvero porre t = 0, x = xmax e v = 0).
5. Calcolare x e v al tempo t + ?t effettuando un passo d’integrazione tramite le equazioni (1)
e (2).
(1) = v += -(k/m)*(x + alpha*x*x*x)*dt
(2) = x += v*dt
6. Aggiornare il tempo t incrementandolo di ?t.
7. Calcolare il prodotto P = x(t + ?t)x(t). Si noti che se P < 0 allora si è trovato uno zero di
x(t). Dunque nel caso in cui P < 0, memorizzare il valore attuale di t in un array chiamato Ts.
Risulterà quindi che il primo elemento di Ts è il tempo a cui abbiamo trovato il primo zero di
x(t), il secondo elemento quello a cui abbiamo trovato il secondo zero e così via.
8. Se il numero di zeri di x(t) è pari a 3 il ciclo sui passi d’integrazione deve terminare, altrimenti
si torna al punto 5.
9. Una stima numerica Test del periodo sarà pari alla differenza tra l’ultimo (cioè il
terzo) ed il primo elemento dell’array Ts.
10. Stampare il periodo calcolato numericamente Test con 5 cifre dopo la virgola.
Nello scrivere il programma si richiede che vengano implementate le seguenti funzioni:
• inserimento(...), che richiede l’inserimento di un numero numero in virgola mobile
• passo(...), che effettuerà un singolo passo d’integrazione aggiornando i valori di x e v tramite
le equazioni (1) e (2).
• force(...), che dati x, k, m e a restituisce il valore -(k/m)*(x + ax^3)
Infine si calcoli il valore di Test per k = 9.8 N/m, m = 1 kg, a = -1/6 e xmax = 0.0175 m e si riporti
il risultato nel file periodo-stimato.tx
Mio svolgimento:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
void inserimento(char *msg, char *fmt, void *v);
double force(double x, double k, double m, double alpha);
void passo(double *v, double *x, double m, double k, double alpha, double t);
int main() {
double xmax, k, m, alpha;
int fine = 0;
while (!fine) {
inserimento("Inserisci il valore della costante elastica ", "%lf", &k);
inserimento("Inserisci il valore della massa ", "%lf", &m);
inserimento("Inserisci il valore della ampiezza massima delle oscillazioni ", "%lf", &xmax);
if (k <= 0 || m <= 0 || xmax <= 0) {
printf("ERRORE:Le quantita' inserite devono essere positive\n");
fine=0;
}
else
fine=1;
}
inserimento("Inserisci il valore di alpha ", "%lf", &alpha);
double Thar = 2*M_PI*sqrt(m/k);
printf("Il periodo valido per piccole oscillazioni e': %.5lf\n",Thar);
double dt = Thar/pow(2,20);
printf("Il passo temporale vale: %e\n",dt);
double v, x, t, Ts[3];
v = 0;
x = xmax;
t = 0;
int i = 0, zeri = 0;
do {
passo(&v,&x,m,k,alpha,t);
if (xmax*x < 0) {
Ts[i] = t;
i++;
zeri++;
}
t += dt;
xmax = x;
} while (zeri < 3);
double Test;
Test = Ts[2] - Ts[0];
printf("Una stima numerica del periodo della molla e' pari a; %.5lf\n",Test);
}
void inserimento(char *msg, char *fmt, void *v)
{
int fine, res, c;
fine=0;
while (!fine)
{
printf("%s", msg);
fine=1;
res=scanf(fmt, v);
if (ferror(stdin)||feof(stdin))
{
printf("\n");
clearerr(stdin);
fine=0;
continue;
}
if (res < 1)
{
printf("Problema nella conversione\n");
fine=0;
}
while ((c=getchar())!='\n');
}
}
double force(double x, double k, double m, double alpha) {
return (-k/m)*(x + alpha*x*x*x);
}
void passo(double *v, double *x, double m, double k, double alpha, double t) {
double tempx = *x;
double tempv = *v;
tempv += force(tempx,k,m,alpha)*t;
tempx += force(tempx,k,m,alpha)*t*t;
*x = tempx;
*v = tempv;
}
Il programma esegue all'infinito, probabilmente perchè zeri non è mai 3, qualcuno sa dirmi come mai?