Passa al tema normale
Discussioni su argomenti di Informatica

Regole del forum

Consulta il nostro regolamento e la guida per scrivere le formule
Rispondi al messaggio

Matlab e Biot - Savart

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

Re: Matlab e Biot - Savart

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.

Re: Matlab e Biot - Savart

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.

Re: Matlab e Biot - Savart

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.

Re: Matlab e Biot - Savart

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.

Re: Matlab e Biot - Savart

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');
Rispondi al messaggio