我最開始是從python入手的,它本身就是一種面對對象程式設計的語言。matlab也支援這樣的程式設計方式或是方法。再一次提一下 我的好友叮叮當當,他一直堅持不斷地學習開拓自己的知識面和相關技能,很優秀的一個人。這個matlab面對對象程式設計的方法也是他介紹引入我們實驗室的。
既然他都這麼竭力推薦了,咱也不要辜負别人好心是不是,這裡先記錄一下我借助他給的class類編寫的一個簡單的功能(無窮大平面算電流産生的磁場)。之後我會逐一從簡單例子入手,慢慢更新matlab的class編寫功能。這篇部落格算是做個預告,也督促自己學習面對對象的程式設計方式。
classdef sc_B < handle
properties
p %幾何圖形輸入
angles
f %保角變換對象
I %電流大小
Iw %電流w坐标
Iz %電流z坐标
ow %待求解點w坐标
oz %待求解點z坐标
L %z平面上下闆之間的距離
Lmax %z上闆坐标
Lmin %z下闆坐标
L1 %電流到下闆距離
L2 %電流到上闆距離
Bz %z平面中待求解點磁密
Bw %w平面中待求解點磁密
end
methods
function obj = sc_B(p,angles,I,Iw)
obj.p=p;
obj.angles=angles;
obj.I=I;
obj.Iw=Iw;
obj.f=crrectmap(obj.p,obj.angles); %矩形z變換域
end
function cal_sc(obj)
%計算變換後的坐标
obj.Iz=obj.f.evalinv(obj.Iw);
obj.oz=obj.f.evalinv(obj.ow);
obj.L=max(imag(obj.f.prevertex))-min(imag(obj.f.prevertex));
obj.Lmax=max(imag(obj.f.prevertex));
obj.Lmin=min(imag(obj.f.prevertex));
obj.L1=imag(obj.Iz)-obj.Lmin;
obj.L2=abs(imag(obj.Iz)-obj.Lmax);
end
% function cal_Bz(obj)
% obj.Bz=0;
% mu0=4*pi*1e-7;
% for n=-1:1 %鏡像法
% %畢奧薩伐定律
% obj.Bz=obj.Bz+mu0*obj.I./(2*pi*abs(obj.oz-obj.Iz+n*obj.L*1i).^2).*(obj.oz-obj.Iz+n*obj.L*1i)*1i;
% end
% % for n=2:3 %鏡像法
% % n=2;
% % 畢奧薩伐定律
% % obj.Bz=obj.Bz+mu0*obj.I./(2*pi*abs(obj.oz-obj.Iz+n*obj.L*1i).^2).*(obj.oz-obj.Iz+n*obj.L*1i)*1i;
% % end
% end %鏡像法在電流不位于中點時失效,需要重新編寫
function cal_Bz(obj)
obj.Bz=0;
mu0=4*pi*1e-7;
obj.Bz=obj.Bz+mu0*obj.I./(2*pi*abs(obj.oz-obj.Iz).^2).*(obj.oz-obj.Iz)*1i;
obj.Bz=obj.Bz+mu0*obj.I./(2*pi*abs(obj.oz-obj.Iz+2*obj.L1*1i).^2).*(obj.oz-obj.Iz+2*obj.L1*1i)*1i;
obj.Bz=obj.Bz+mu0*obj.I./(2*pi*abs(obj.oz-obj.Iz-2*obj.L2*1i).^2).*(obj.oz-obj.Iz-2*obj.L2*1i)*1i;
Item1=obj.Iz+2*obj.L2*1i; %起始對稱電流坐标 上闆
for n=1:10
if mod(n,2)==1
dis=abs(imag(Item1)-obj.Lmin);
Item1=Item1-2*dis*1i; %更新電流位置
obj.Bz=obj.Bz+mu0*obj.I./(2*pi*abs(obj.oz-Item1).^2).*(obj.oz-Item1)*1i;
else
dis=abs(obj.Lmax-imag(Item1));
Item1=Item1+2*dis*1i;
obj.Bz=obj.Bz+mu0*obj.I./(2*pi*abs(obj.oz-Item1).^2).*(obj.oz-Item1)*1i;
end
end
Item2=obj.Iz-2*obj.L1*1i; %起始對稱電流坐标 下闆
for n=1:10
if mod(n,2)==1
dis=abs(obj.Lmax-imag(Item2));
Item2=Item2+2*dis*1i;
obj.Bz=obj.Bz+mu0*obj.I./(2*pi*abs(obj.oz-Item2).^2).*(obj.oz-Item2)*1i;
else
dis=abs(imag(Item2)-obj.Lmin);
Item2=Item2-2*dis*1i; %更新電流位置
obj.Bz=obj.Bz+mu0*obj.I./(2*pi*abs(obj.oz-Item2).^2).*(obj.oz-Item2)*1i;
end
end
end
function cal_Bw(obj)
obj.cal_Bz;
obj.Bw=obj.Bz./conj(obj.f.evaldiff(obj.oz));
end
end
end