天天看點

Matlab-面對對象程式設計-開端

我最開始是從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
           

繼續閱讀