Matlab e Biot - Savart

Messaggioda D4lF4zZI0 » 09/05/2019, 12:01

Ciao a tutti,
sono un paio di giorni che mi sono rimesso a smanettare con Matlab e mi è venuta la curiosità di voler usare Matlab per implementare un pò di formulette sui campi elettromagnetici.
Son voluto partire da una cosa facile, ovvero dalla legge di Biot - Savart, ma non so come partire.
Ovviamente non vi chiedo l'algoritmo, ma chiedo se qualcuno di voi ha degli appunti da cui poter capire come implementare quella formula in matlab.
Grazie
D4lF4zZI0
Average Member
Average Member
 
Messaggio: 964 di 969
Iscritto il: 25/03/2012, 22:01

Re: Matlab e Biot - Savart

Messaggioda apatriarca » 19/05/2019, 17:48

Non è molto chiaro che cosa tu voglia effettivamente fare. Qual è il tuo dominio di integrazione? Come hai l'intenzione di rappresentare le correnti e il campo magnetico?

Secondo me è meglio se parti da un particolare problema e cerchi di modellarlo in qualche modo, piuttosto che cercare di risolvere una qualche equazione per cui esistono diversi modi di procedere.
apatriarca
Moderatore
Moderatore
 
Messaggio: 5219 di 5271
Iscritto il: 08/12/2008, 21:37
Località: Londra

Re: Matlab e Biot - Savart

Messaggioda D4lF4zZI0 » 20/05/2019, 08:39

Beh in effetti rileggendo il post hai ragione a dire che è un pò confuso.
In parole povere, vorrei imparare a risolvere numericamente con Matlab integrali come questi:
$ ul(b)(ul(r))=(mu_oI)/(4pi)int_(gamma)^() (dul(s)xul(r))/r^3 $
per geometria pressoché semplici quali una spira circolare, un filo rettilineo e via dicendo.
Ho provato a cercare in rete materiale sul come fare per capire e magari risolvere cose anche un pò più complicate, ma trovo solo codici già svolti; per questo motivo chiedevo se qualcuno di voi aveva del materiale.
D4lF4zZI0
Average Member
Average Member
 
Messaggio: 965 di 969
Iscritto il: 25/03/2012, 22:01

Re: Matlab e Biot - Savart

Messaggioda Raptorista » 20/05/2019, 11:02

Conosci qualche funzione matlab per calcolare l'approssimazione di un integrale su un intervallo?
In tal caso: se la geometria è semplice, cioè ne hai una descrizione analitica, allora puoi riscrivere l'integrale su un intervallo e integrare quello che ti esce; se invece la geometria è complicata allora devi prima crearne una mesh e poi integrare sui segmenti che compongono la mesh.
Un matematico ha scritto:... come mia nonna che vuole da anni il sistema per vincere al lotto e crede che io, in quanto matematico, sia fallito perché non glielo trovo


Immagine
Avatar utente
Raptorista
Moderatore
Moderatore
 
Messaggio: 5257 di 5292
Iscritto il: 28/09/2008, 20:58

Re: Matlab e Biot - Savart

Messaggioda apatriarca » 20/05/2019, 11:57

Suppongo tu non voglia limitarti al caso in cui hai una geometria semplice. Hai quindi bisogno di costruirti una mesh. Devi cioè approssimare la tua geometria usando dei segmenti connessi tra di loro. Più piccoli saranno i segmenti migliore sarà l'approssimazione della geometria, ma crescerà anche il tempo di esecuzione. A questo punto il tuo integrale diventa una sommatoria di integrali, uno per ogni segmento. Siccome è abbastanza semplice quell'integrale per un segmento non hai neanche bisogno di calcolarlo in modo approssimato.
apatriarca
Moderatore
Moderatore
 
Messaggio: 5221 di 5271
Iscritto il: 08/12/2008, 21:37
Località: Londra

Re: Matlab e Biot - Savart

Messaggioda D4lF4zZI0 » 21/05/2019, 08:45

Infatti, lo scopo è estendere l'algoritmo anche a geometria non semplici.
Comunque, in questi giorni ho buttato giù un pò di codice ( che credo che funzioni, ma una consulenza e un consiglio sarebbe gradito ) che incollo qua:
clf
clear all
clc

%% Dominio
% Numero di punti del dominio
ND = 10;

% Estensione del dominio
Dom = [-1 1;
-1 1;
0.1 6];

%% Geometria di analisi
% Parametri
I = 20;
mu = 4*pi*10^-7;
gamma = mu*I/(4*pi);

% Passo di integrazione
ds = 1e-4;

% Geometria filo rettilineo ( supposto disposto lungo l'asse z )
L = [0 0 0;
0 0 5];

Nl = numel(L)/3;

%% Inizializzazione variabili
% Componenti campo di induzione magnetica B = (Bx, By, Bz);
Bx = zeros(ND, ND, ND);
By = zeros(ND, ND, ND);
Bz = zeros(ND, ND, ND);

% Volume Mesh
[X, Y, Z] = meshgrid(linspace(Dom(1,1), Dom(1,2), ND), ...
linspace(Dom(2,1), Dom(2,2), ND), ...
linspace(Dom(3,1), Dom(3,2), ND));

%% Integrazione legge di Biot-Savart
for i = 1:ND
for j = 1:ND
for k = 1:ND
% Punto in cui calcolare il campo
pTest = [X(i,j,k) Y(i,j,k) Z(i,j,k)];
% La curva viene discretizzata in Nl punti e l'argoritmo
% viene iterato Nl-1 volte ( Infatti sono Nl-1 i segmenti in
% cui viene divisa la curva.
% Ogni segmento, a sua volta, viene suddiviso in passi elementi elementari
% di lunghezza ds ( passo di integrazione ) e per ognuno degli
% elementi viene calcolato l'incremento del campo dB
for pCurv = 1:Nl-1
% Lunghezza dl
len = norm(L(pCurv,:) - L(pCurv+1,:));

% Numero di punti dl
% Viene effettuato un contollo della discretizzazione della
% curva; infatti, se dl < ds, allora non avrebbe senso la
% discretizzazione.
Npi = ceil(len/ds);
if Npi < 3
error('Il passo di integrazione è troppo grande')
end

% Discretizzazione curva
Lx = linspace(L(pCurv,1), L(pCurv+1,1), Npi);
Ly = linspace(L(pCurv,2), L(pCurv+1,2), Npi);
Lz = linspace(L(pCurv,3), L(pCurv+1,3), Npi);

% Integrazione
for s = 1:Npi-1
Rx = Lx(s) - pTest(1);
Ry = Ly(s) - pTest(2);
Rz = Lz(s) - pTest(3);

dLx = Lx(s+1) - Lx(s);
dLy = Ly(s+1) - Ly(s);
dLz = Lz(s+1) - Lz(s);

% Distanza
R = sqrt(Rx^2 + Ry^2 + Rz^2);

% Biot-Savart
dL = [dLx dLy dLz];
r = [Rx Ry Rz];
dB = gamma*cross(dL,r)/R^3;

% Somma ( integrale ) del campo
Bx(i,j,k) = Bx(i,j,k) + dB(1);
By(i,j,k) = By(i,j,k) + dB(2);
Bz(i,j,k) = Bz(i,j,k) + dB(3);
end
end
end
end
end
%% Modulo del campo di induzione magnetica
M = sqrt(Bx.^2+By.^2+Bz.^2);

%% Grafico
quiver3(X,Y,Z,Bx,By,Bz);
hold on
plot3(L(:,1),L(:,2),L(:,3),'r-','linewidth',3);
hold on
xlabel('x');
ylabel('y');
zlabel('z');
title('Campo vettoriale induzione magnetica');
D4lF4zZI0
Average Member
Average Member
 
Messaggio: 966 di 969
Iscritto il: 25/03/2012, 22:01


Torna a Informatica

Chi c’è in linea

Visitano il forum: Nessuno e 4 ospiti