镜像法计算变压器漏磁场之四

铁心线圈磁场计算的编程实现。

八、变压器漏磁场计算C++编程实现

1、数据结构定义

struct Point
{double x, y;Point() { x = y = 0; }Point(double x, double y) { this->x =x, this->y = y; }Point& Offset(double dx, double dy) { x += dx, y += dy; return *this; }
};struct Wire
{Point pnt;double w;double h;double J;  // 电密void GetVertex(Point* arVtx) const{arVtx[0] = Point(pnt.x, pnt.y);arVtx[1] = Point(pnt.x + w, pnt.y);arVtx[2] = Point(pnt.x + w, pnt.y + h);arVtx[3] = Point(pnt.x, pnt.y + h);}Point GetCenter() const { return Point(pnt.x+w/2, pnt.y+h/2); }Wire& Offset(double dx, double dy) { pnt.Offset(dx, dy); return *this; }Wire& Clon() const {  return Wire(*this); }
};struct Node
{double x;double y;double B;double α;double A;Node() { x = y = A=B= α= 0; }Node(double x, double y, double v=0) {this->x = x; this->y = y; B = v; A = α = 0;}operator CPoint() const { return CPoint(int(x + 0.5), int(y + 0.5)); }
};struct Edge
{Edge() { x1 = x2 = y1 = y2 = 0; }double x1;double y1;double x2;double y2;
};struct Triangle
{Triangle() { arNode[0] = NULL, arNode[1] = NULL, arNode[2] = NULL; }Triangle(Node* p1, Node* p2, Node* p3) {arNode[0] = p1; arNode[1] = p2; arNode[2] = p3;}void GetExtremumB(double& nMin, double& nMax) const {nMin = nMax= arNode[0]->B;for (int i=1; i<3; i++){nMin = min(nMin, arNode[i]->B);nMax = max(nMax, arNode[i]->B);}}void GetExtremumA(double& nMin, double& nMax) const {nMin = nMax = arNode[0]->A;for (int i = 1; i < 3; i++){nMin = min(nMin, arNode[i]->A);nMax = max(nMax, arNode[i]->A);}}Node* arNode[3];
};struct Section
{double x;double y;double nWidth;double nHeight;double nMeshSize;double GetMeshSizeX() const {return nWidth / int(nWidth / nMeshSize + 0.99);}double GetMeshSizeY() const {return nHeight / int(nHeight / nMeshSize + 0.99);}Point GetCenter() const { return Point(x + nWidth / 2, y + nHeight / 2); }
};

2、磁场计算类定义

class CFieldData
{
public:CFieldData();~CFieldData();void Init();void Clear();void CreateFieldMesh(double nMeshSize = 100);void CalculteField(const Wire& wire, double μ);void CalculteOriginField(); void CalculteImageField();const std::vector<Node>& GetFieldNode() { return m_arFieldNode; }const Section& GetFieldArea() { return  m_stFieldArea; }// 场区域const std::vector<Wire>& GetWires(int idx) { return m_arWires; }void DrawGrid(CDC* pDC, CRect rect);void DrawVectorA(CDC* pDC, CRect rect);void DrawVectorB(CDC* pDC, CRect rect);void DrawContourA(CDC* pDC, CRect rect);void DrawContourB(CDC* pDC, CRect rect);void DrawFrame(CDC* pDC, CRect rect);void DrawDensity(CDC* pDC, CRect rect);void DrawImageLine(CDC* pDC, CRect rect);COLORREF GetColor(double nValue) const;void OutputField(int nFlag) const;protected:double m_nMiu1;double m_nMiu2;double m_nImageDistance;       // 导线到分界面距离double m_nMinFlux;               // 最小磁感应强度double m_nMaxFlux;                // 最大磁感应强度Section  m_stFieldArea;           // 场区域std::vector<Wire> m_arWires;    // 导线std::vector<Node> m_arFieldNode;std::vector<Triangle> m_arTriangles;
};

3、数据初始化处理

void CFieldData::Init()
{// 分界面在x轴上// 导线距离分界面1000mm// 场域宽和高都为4000mmm_nMiu1 = 4 * M_PI * 1e-7;  // μ0=4π×10-7 特斯拉·米/安培m_nMiu2 = 2000 * m_nMiu1;m_nImageDistance=600;     // 导线到分界面距离m_stFieldArea.nWidth = 4000;    // 场区域m_stFieldArea.nHeight = 4000;m_stFieldArea.x = 0;// m_stWire.GetCenter().x - m_stFieldArea.nWidth / 2;m_stFieldArea.y = 0;// m_stWire.GetCenter().y - m_stFieldArea.nHeight / 2;m_stFieldArea.nMeshSize = 50;Wire wire;wire.pnt = m_stFieldArea.GetCenter().Offset(-1000, 0);        // 导线位置wire.w = 500; // mm;wire.h = 200; // mm;wire.J = -3.3; // 安培/mm^2wire.Offset(-wire.w / 2, -wire.h / 2);double nSpan = 210;int nTurn = 12;Wire wire1 = wire;wire1.Offset(-400, nSpan * (nTurn/2+1));for (int i=0; i<nTurn; i++){m_arWires.push_back(wire1.Offset(0, -nSpan));}wire1 = wire;wire1.Offset(400, nSpan * (nTurn / 2 + 1)).J *= -1;for (int i = 0; i < nTurn; i++){m_arWires.push_back(wire1.Offset(0, -nSpan));}
}

4、原始电流和镜像电流磁场计算

void CFieldData::CalculteOriginField()
{for ( UINT i=0; i<m_arWires.size(); i++ ){const Wire& wire = m_arWires[i];CalculteField(wire, m_nMiu1);}}void CFieldData::CalculteImageField()
{for (UINT i = 0; i < m_arWires.size(); i++){Wire wire = m_arWires[i];wire.pnt.x = -wire.pnt.x - wire.w;    // 水平镜像wire.J *= (m_nMiu2 - m_nMiu1) / (m_nMiu2 + m_nMiu1);CalculteField(wire, m_nMiu1);}
}void CFieldData::CalculteField(const Wire& wire, double μ)
{double J = wire.J;Point arWirePos[4];wire.GetVertex(arWirePos);for ( UINT i=0; i<m_arFieldNode.size(); i++ ){Node& node = m_arFieldNode[i];double A = 0, Bx = 0, By = 0;for (int j=0; j<4; j++){double xn = arWirePos[j].x;double yn = arWirePos[j].y;double Δx = node.x - xn;double Δy = node.y - yn;if (abs(Δx) < 1e-10)Δx<0 ? Δx = -1e-10 : Δx = 1e-10;if (abs(Δy) < 1e-10)Δy<0 ? Δy = -1e-10 : Δy = 1e-10;if (abs(xn) < 1e-10)xn < 0 ? xn = -1e-10 : xn = 1e-10;if (abs(yn) < 1e-10)yn < 0 ? yn = -1e-10 : yn = 1e-10;double C = -xn*yn*log(xn*xn + yn*yn) - xn*xn*atan(yn / xn) - yn*yn*atan(xn / yn);A += pow(-1, j + 1)*(Δx*Δy*log(Δx*Δx + Δy*Δy) + Δx*Δx*atan(Δy / Δx) + Δy*Δy*atan(Δx / Δy) + C);Bx += pow(-1, j + 1)*(Δx*log(Δx*Δx + Δy*Δy) + Δx + 2 * Δy*atan(Δx / Δy));By += pow(-1, j + 1)*(Δy*log(Δx*Δx + Δy*Δy) + Δy + 2 * Δx*atan(Δy / Δx));}A *= -(1e-7*J);Bx *= -(1e-7*J);By *= (1e-7*J);if (abs(node.A) > 0){A += node.A;}if (node.B > 0){Bx += node.B * cos(node.α);By += node.B * sin(node.α);}if (Bx == 0)Bx = 1e-10;double B = pow(Bx*Bx + By*By, 0.5);double α = atan(By / Bx);if (Bx < 0)α += M_PI;node.A = A;node.B = B;node.α = α;}
}

九、计算结果显示

1、计算网格

2、无铁心时(无介质分界面)磁矢量位密度图

3、有铁心时(有介质分界面)磁矢量位密度图

4、无铁心时(无介质分界面)磁矢量位梯度图

5、有铁心时(有介质分界面)磁矢量位梯度图

6、无铁心时(无介质分界面)磁感应强度密度图

7、有铁心时(有介质分界面)磁感应强度密度图

8、无铁心时(无介质分界面)磁感应强度梯度图

9、有铁心时(有介质分界面)磁感应强度梯度图

10、无铁心时(无介质分界面)磁感应强度矢量图

11、有铁心时(有介质分界面)磁感应强度矢量图

12、铁心线圈漏磁场图

示例程序请参考https://download.csdn.net/download/yzhuang/13507119

镜像法计算变压器漏磁场(四)相关推荐

  1. 镜像法计算变压器漏磁场(二)

    镜像法计算变压器漏磁场 用镜像法计算变压器漏磁场可以用少量的计算获得较准确结果,以及确定漏磁感应强度准确值的范围. 三.变压器漏磁场区域的基本模型及导线磁场计算公式 已知矩形导线的四个顶点分别为P1, ...

  2. 镜像法计算变压器漏磁场(一)

    镜像法计算变压器漏磁场之一 前言 变压器漏磁场和镜像法的基本概念. 一.镜像法概念 求解恒等磁场问题,通常可归结为求解满足给定边值条件的泊松方程或拉普拉斯方程的问题.根据磁场问题解答的唯一性,可以应用 ...

  3. 镜像法计算变压器漏磁场(三)

    镜像法计算变压器漏磁场之三 前文中给出的公式,存在一个无限项,在现实的计算中,显然需要处理一下. 七.磁感应强度和镜像电流次数之间的关系 建立变压器模型: 用于计算磁感应强度的式Bx.式By都有无限多 ...

  4. 单个导线周围不同介质磁场镜像法计算实现

    单个导线周围不同介质磁场镜像法计算实现 前言 编程实现无限长单根导线在不同介质中的磁场,显示磁感应强度的向量和磁场线 一.镜像法说明 在两种介质中,磁导率分别为μ1和μ2,在介质1内置有电流为 I 的 ...

  5. 电动力学每日一题 2021/10/13 用Fourier变换法计算静止电荷产生的电场

    电动力学每日一题 2021/10/13 用Fourier变换法计算静止电荷产生的电场 静止点电荷 具有均匀线密度的静止电荷产生的电场 具有均匀面密度的静止电荷产生的电场 用Fourier变换法计算电场 ...

  6. 动力学矩阵法计算石墨烯声子谱

    上个学期,学习固体物理,老师让写一个程序来计算石墨烯的声子谱和振动的态密度进行画图.大二的假期里自学了Python但是没有实际自己写过,决定用Python代码来实现这个任务(最重要的是自己能力不行,c ...

  7. 人工智能数学基础---定积分4:使用换元法计算定积分

    一.引言 在<人工智能数学基础–不定积分2:利用换元法求不定积分>介绍了三种换元法求不定积分的方法及案例,在<人工智能数学基础-定积分3:微积分基本公式(牛顿-莱布尼茨公式)> ...

  8. 龙贝格方法计算椭圆周长

    龙贝格方法计算椭圆周长 椭圆周长定积分公式 由于椭圆的周长可以看作是很多Δx\Delta xΔx与Δy\Delta yΔy直角边构成的斜边的和.因此就是dx2+dy2\sqrt{dx^2+dy^2}d ...

  9. MATLAB牛拉法计算潮流,matlab潮流计算

    <matlab潮流计算>由会员分享,可在线阅读,更多相关<matlab潮流计算(14页珍藏版)>请在装配图网上搜索. 1.附录1使用牛顿拉夫逊法进行潮流计算的Matlab程序代 ...

最新文章

  1. Ubuntu 16.04 安装arm-linux-gcc交叉编译
  2. g++ 4.4.7 template 没问题,前面应该程序问题!!
  3. vue 只在父级容器移动_Vue易遗忘的基础复习(二)
  4. vim插件推荐之auto-pairs
  5. .net多线程 Thread
  6. boost::mpi模块实现传输数据类型的骨架和内容的通信器的测试
  7. java中PL层_安装pljava - RuralHunter的个人空间 - OSCHINA - 中文开源技术交流社区
  8. 雷林鹏分享:PHP 表单 - 验证邮件和URL
  9. 小米2系列板砖自救行动
  10. dp动态规划分类详解
  11. C#编写IE插件的一些经验
  12. 图像直方图以及直方图的应用
  13. 浅谈大数据和人工智能
  14. python实现排序的lowB三人组:冒泡、插入、选择
  15. 【博士论文】深度学习的对抗攻击与鲁棒性测评
  16. 【Sql】sql server2008附加数据库:错误9003
  17. Halcon学习笔记:3D_coordinates(3D标定)
  18. echart中饼图如何显示数据 实现鼠标移动切换显示(vue中)
  19. C/C++动态申请空间方式
  20. 最详解Docker实例教程

热门文章

  1. 佛经里的经典人生哲理100条
  2. Codeforces-1667: B Optimal Partition
  3. linux查看硬盘驱动,linux查看硬件信息及驱动设备相关整理
  4. python爬虫实战经典案例,突破反爬!爬取短视频!
  5. tar zip等解压命令
  6. python制作软件下载_Python制作CSDN免积分下载器
  7. 将 FML 用于 WebLogic Tuxedo Connector 转自bea.com
  8. 排序1:快速排序(三种)、归并排序、计数排序
  9. 麒麟9000和麒麟990哪个好?有什么区别
  10. excel减法函数_Excel公式练习35: 拆分连字符分隔的数字并放置在同一列中