Programma induzione elettromagnetica

di il
13 risposte

Programma induzione elettromagnetica

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?

13 Risposte

  • Re: Programma induzione elettromagnetica

    "Meccanico, la mia macchina non va, aggiustamela".
    "Cos'ha che non va?"
    "Non va, non ti basta?"
    Il meccanico sta prendendo un grosso tubo di ferro e viene nella tua direzione, che fai?
  • Re: Programma induzione elettromagnetica

    Il mio programma si blocca ad un certo punto, come mai succede questo?
    A me si blocca in un ALTRO punto... come mai?

    Andrea Quaglia ha scritto:


    "Meccanico, la mia macchina non va, aggiustamela".
    "Cos'ha che non va?"
    "Non va, non ti basta?"
    Il meccanico sta prendendo un grosso tubo di ferro e viene nella tua direzione, che fai?
  • Re: Programma induzione elettromagnetica

    Ciao, prova a descrivere il problema, le prove che hai fatto, dove si blocca, che errore viene fuori, ecc altrimenti è difficile riceve aiuto
  • Re: Programma induzione elettromagnetica

    Intanto, in fase di COMPILAZIONE c'è un errore in
    
    		coord[i] = Yc;
    
    ovvero

    Errore : utilizzata variabile locale 'i' non inizializzata

    e se non correggi il programma non può essere neanche provato.
  • Re: Programma induzione elettromagnetica

    oregon ha scritto:


    Intanto, in fase di COMPILAZIONE c'è un errore in
    
    		coord[i] = Yc;
    
    ovvero

    Errore : utilizzata variabile locale 'i' non inizializzata

    e se non correggi il programma non può essere neanche provato.
    A me gcc non dà quel warning (e sto usando -Wall). Curiosamente, il programma mi andava in segfault già alla prima scanf (provato con il debugger). Messo i=0, il programma va. Il Grande Cthulhu si è di nuovo manifestato!
  • Re: Programma induzione elettromagnetica

    Andrea Quaglia ha scritto:


    Il Grande Cthulhu si è di nuovo manifestato!
    Nella città sommersa di R'lyeh da eoni dorme sognando e a volte si manifesta.
    Grande Lovecraft, quanta cultura trasuda questo forum
  • Re: Programma induzione elettromagnetica

    Altra curiosità: compilando in modalità release il warning appare! Mi sa di baco di gcc.
  • Re: Programma induzione elettromagnetica

    Scusate se non sono stato chiaro nella descrizione del problema, il fatto è che effettivamente il programma si bloccava e basta
    Nel senso che al ciclo do while inizia a calcolare Yc, ma superato il valore 5/2 r il programma si interrompeva dal nulla, non nel senso che terminava ma proprio che si chiudeva il terminale dal nulla.
    Comunque ora c'è un altro problema non previsto: abs(I) è piccolissima, questo mi fa sospettare che c'è un errore...
  • Re: Programma induzione elettromagnetica

    @Dracmaleontes: non editare i post (soprattutto i sorgenti), altrimenti chi dovesse passare di qui tra un po' non capirebbe perché il sorgente copiato dal tuo primo post non mostra alcuno dei problemi che lamentavi.
  • Re: Programma induzione elettromagnetica

    @Andrea Quaglia: scusa papà non lo farò più
  • Re: Programma induzione elettromagnetica

    Dracmaleontes ha scritto:


    @Andrea Quaglia: scusa papà non lo farò più
    Sarcasmo fuori posto ... era un consiglio su come comportarsi nel forum per ricevere aiuto correttamente. Ma se non vuoi più avere risposte ai tuoi quesiti da ora in poi, basta dirlo, figliolo ...
  • Re: Programma induzione elettromagnetica

    Lo stesso sarcasmo che avete usato con me quando ho postato il mio problema
  • Re: Programma induzione elettromagnetica

    No, quella era ironia ... dato che non avevi fatto capire nulla del TUO problema ... la tua è "gratuita ironia" ... c'è differenza ...

    Comunque, in in bocca al lupo per il resto dei tuoi studi.
Devi accedere o registrarti per scrivere nel forum
13 risposte