Lo scopo del programma è calcolare l’evoluzione temporale della corrente che scorre in una spira circolare
che si muove in una zona in cui è presente un campo magnetico.
Consideriamo una spira di forma circolare di resistenza R = 220 O
e raggio r = 2 cm che si muove lungo l’asse y di un sistema di assi cartesiani a velocità
costante v, per cui l’equazione del moto del centro della spira è yc(t) = yc(0) + vt e
yc(0) = -5/2
r `e la coordinata del centro della spira per t = 0. Se il campo magnetico di
modulo B = 1 mT `e presente solo nella regione delle ordinate positive, il flusso di questo
campo attraverso la spira si può valutare come il prodotto di B per l’area della porzione
di cerchio contenuta in questa regione.
In questo caso, la corrente che scorre nella spira è data da
I = -1/R * dF/dt (1)
dove R `e una caratteristica del conduttore detta resistenza e F = BS è una grandezza
chiamata flusso del campo magnetico B attraverso la superficie S, che è l’area della
porzione di spira immersa nel campo.
Scrivi un programma per calcolare la corrente che scorre nella spira per diversi valori
della velocità con la quale si muove, secondo la traccia che segue.
1. Il programma inizia chiedendo all’utente di inserire la velocità v della spira, con
0 ? v ? 35 cm/s . Qualora la velocità immessa dall’utente non sia compresa
nell’intervallo specificato, il programma dovr avvisare l’utente dell’errore invitandolo a inserire una velocità corretta. La richiesta è ripetuta fino a quando
l’utente non soddisfa i requisiti.
2. Il programma calcola la posizione del centro della spira per una sequenza di
tempi equispaziati di dt = 0.1 s, partendo da t = 0 e fino a quando il centro
della spira raggiunge la coordinata yc(t) = +5/2*r
3. Per ciascuno dei tempi di cui sopra, il programma calcola quindi la corrente che
scorre nella spira usando l’equazione (1).
4. Per il calcolo dell’area S da impiegare per valutare il flusso F, nel programma `e
definita una funzione di nome area che restituisce l’area della porzione di spira
presente nella regione con y > 0 (quella tratteggiata nella figura).
5. La funzione area calcola la superficie S con un metodo Monte Carlo noto come
hit & miss: si generano N punti uniformemente distribuiti in un quadrato di lato
2r che circoscrive la spira. Si conta quindi il numero n di punti presenti nella
regione di cui si vuole conoscere l’area. Quest’ultima si ottiene moltiplicando
l’area del quadrato per la frazione n/N dei punti interni all’area d’interesse.
La funzione deve restituire tale area, espressa in m^22
, per una generica spira di
raggio r, espressa in cm, il cui centro si trova alla coordinata yc sull’asse verticale,
usando un numero N di punti generico.
6. I valori della coordinata yc del centro della spira e della corrente che vi scorre
sono quindi memorizzati in due array di taglia opportuna. Si osservi che, per
esprimere correttamente la corrente (in Ampere, A), l’area S va espressa in m2
e il campo B in T.
7. I due array, insieme a una stringa che rappresenta il nome di un file, sono quindi
passati a una funzione di nome dump che scrive sul file indicato un numero di
righe pari al numero di iterazioni eseguite ai punti precedenti, ciascuna delle
quali contiene l’indice dell’array, la coordinata del centro raggiunta e la corrente
che scorre nella spira.
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
#define NMAX 2000000
double area(double r, double Yc);
void dump(double a[], double b[], int i, char *filename);
int main() {
double v, t, Yc, r, R, S, I, dt;
double coord[200], corr[200];
int i = 0;
srand(time(NULL));
do {
printf("Inserisci il valore della velocita': ");
scanf("%lf",&v);
if (v < 0 || v > 35)
printf("[ERRORE] la velocita' e' compresa tra 0 e 35!\n\n");
} while (v < 0 || v > 35);
dt = 0.1;
t = 0.0;
r = 2.0;
R = 220.0;
S = 0;
do {
Yc = -5.0/2.0*r + v*t;
coord[i] = Yc;
t += dt;
S += area(r,Yc);
printf("%lf\n",S);
I = -1.0/R * (S*0.001)/dt;
corr[i] = I;
printf("%lf %lf %lf\n",I,Yc,t);
i++;
} while (Yc < 5.0/2.0*r);
dump(corr,coord,i,"spira.dat");
}
double area(double r, double Yc) {
double Aquad, x, y;
unsigned long long int np;
int i = 0;
Aquad = 4*r*r;
np = 0;
for (i = 0; i < NMAX; i++) {
x = rand()/((double)RAND_MAX)*(2*r) - r;
y = rand()/((double)RAND_MAX)*(2*r) - r;
if (y < sqrt(r*r - x*x) + Yc)
np++;
}
return ((double)np)/NMAX * Aquad * 0.0001;
}
void dump(double a[], double b[], int i, char *filename) {
FILE *f;
f = fopen(filename,"w");
int j;
for(j=0; j < i; j++) {
fprintf(f,"%lf %lf %i\n",a[j],b[j],j);
}
fclose(f);
}
Il mio programma si blocca ad un certo punto, come mai succede questo?