From c84261e24e710de3f2d1996cb0bdf426ba6b167d Mon Sep 17 00:00:00 2001 From: facat Date: Sat, 18 Apr 2020 10:55:58 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E6=88=90=E4=BA=86=E8=AE=A1=E7=AE=97?= =?UTF-8?q?=E4=BB=A3=E8=A1=A8=E6=A1=A3=E8=B7=9D=E4=B8=8B=E6=8E=A7=E5=88=B6?= =?UTF-8?q?=E5=BC=A0=E5=8A=9B=E7=9A=84=E4=BB=A3=E7=A0=81=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Program.cs | 12 ++-- core.cs | 168 +++++++++++++++++++++++++++++++++++------------------ 2 files changed, 121 insertions(+), 59 deletions(-) diff --git a/Program.cs b/Program.cs index a91ca0a..39fe380 100644 --- a/Program.cs +++ b/Program.cs @@ -10,10 +10,14 @@ namespace conductortension { static void Main(string[] args) { - conductortension.Core.calStressLoadNew para = new conductortension.Core.calStressLoadNew(); - double zhangli; - zhangli = 123; - conductortension.Core.CalZhangLi(para, ref zhangli); + //conductortension.Core.calStressLoadNew para = new conductortension.Core.calStressLoadNew(); + //para.DaiWen = 40; + //para.DaiBing = 0; + //para.DaiFeng = 0; + //para.DangJu = 300; + //double zhangli; + //zhangli = 123; + //conductortension.Core.CalZhangLi(para, ref zhangli); } } diff --git a/core.cs b/core.cs index 82a2cf1..8051e5b 100644 --- a/core.cs +++ b/core.cs @@ -4,14 +4,78 @@ namespace conductortension public partial class Core { + + //解状态方程的牛顿法 + public static double nt_equation(double A, double B, double sigma) + { + return Math.Pow(sigma, 3) + A * Math.Pow(sigma, 2) - B; + } + + + public static double d_eqution(double A, double sigma) + { + return 3 * Math.Pow(sigma, 2) + 2 * A * sigma; + } + + + + public static double newton(double A, double B, double sigma,ref bool succeed) + { + succeed = false; + double _sigma = sigma; + int i; + for (i=0; i < 20; i++) + { + double fx = nt_equation(A, B, _sigma); + double d_fx = d_eqution(A, _sigma); + double d_sigma = -fx / d_fx; + if (Math.Abs(d_sigma) < 1e-5) + { + succeed = true; + break; + } + + _sigma = _sigma + d_sigma; + } + return _sigma; + } + + + + //从状态方程接触张力 + //start_tension 牛顿法初值 + //alpha 是膨胀系数 + //E 弹性模量 + //area 导线截面 + //conrol_t 控制条件温度 + //conrol_load 控制条件荷载 + //conrol_tension 控制条件张力 + //load 计算工况荷载 + //t 计算工况温度 + //l 档距 + public static double tensionFrmoStateEquation(double start_tension, double E, double alpha, double area, double control_load, double control_tension, double control_t, double load, double t, double l) + { + double A, B; + //A = E / 24 * Math.Pow(control_load * l / control_tension, 2) - control_tension / area + alpha * E * (t - control_t); + A = Fx(E, control_load, control_tension, alpha, area, control_t, l) + alpha * E * t; + B = E * Math.Pow(load/area * l, 2) / 24; + double tension;//牛顿法初值 + bool succeed=false; + tension = newton(A, B, start_tension / area, ref succeed) * area; + if (succeed) + { + return tension; + } + return double.NaN; + } //alpha 是膨胀系数 //E 弹性模量 //area 导线截面 //t 温度 // l 档距 - public static double Fx(double E, double load, double tension, double alpha, double area, double t,double l) + public static double Fx(double E, double load, double tension, double alpha, double area, double t, double l) { - return E * Math.Pow(load*l / tension, 2) / 24 - tension / area - alpha * E * t; + return E * Math.Pow(load * l / tension, 2) / 24 - tension / area - alpha * E * t; } public static bool CalZhangLi(calStressLoadNew inPut, ref double ZhangLi) @@ -19,7 +83,7 @@ namespace conductortension //张力=T6 //计算最大使用张力 double ZuiDaShiYongZhangLi; //最大使用张力=计算拉断力*保证破断张力取计算拉断力的/安全系数 - ZuiDaShiYongZhangLi = inPut.LaDuanLi * inPut.BaoZhengPoDuanZhangLiXiShu/100 / inPut.AnQuan; + ZuiDaShiYongZhangLi = inPut.LaDuanLi * inPut.BaoZhengPoDuanZhangLiXiShu / 100 / inPut.AnQuan; //ZuiDaShiYongZhangLi = inPut.LaDuanLi / inPut.AnQuan; //计算温度线膨胀系数 double XianPengZhang = inPut.XianPengZhang; @@ -33,7 +97,7 @@ namespace conductortension { inPut.NianPingJun = inPut.NianPingJun / 100; } - double PingJunYunXingZhangLi = inPut.LaDuanLi * inPut.BaoZhengPoDuanZhangLiXiShu/100 * inPut.NianPingJun;///////////////////////////////////////////////////////////////////////年平均是20%还是0.2,这里要求的是小数 + double PingJunYunXingZhangLi = inPut.LaDuanLi * inPut.BaoZhengPoDuanZhangLiXiShu / 100 * inPut.NianPingJun;///////////////////////////////////////////////////////////////////////年平均是20%还是0.2,这里要求的是小数 if (inPut.SheJiFengSuGaoDu == 0) { inPut.SheJiFengSuGaoDu = 10; @@ -49,13 +113,6 @@ namespace conductortension { return false; } - - //计算控制工况、气温、比载、应力 - int KongZhiGongKuang;//1:最低气温,2:覆冰,3大风,4,年平均气温 - double KongZhiQiWen; - double KongZhiBiZai; - double KongZhiYingLi; - //临界档距表计算 //一、初始计算数组,5项分别代表:1:气温,2:荷载,3:容许张力,4:P/T,5:Fo=-(T+A*E*a*t)(N) double[] ChuShiZuiDiQiWen = new double[5]; //最低温 @@ -101,12 +158,12 @@ namespace conductortension ChuShiNianPingJun[3] = ChuShiNianPingJun[1] / ChuShiNianPingJun[2]; ChuShiDaFeng[3] = ChuShiDaFeng[1] / ChuShiDaFeng[2]; ChuShiFuBing[3] = ChuShiFuBing[1] / ChuShiFuBing[2]; - + //计算4个工况下的Fx by 杜孟远2020.4.17 //t_dangju 试探最大Fx时使用的档距 - int[] MaxFxConditionFlag = new int[inPut.DangJu+1];//记录不同t_dangju下,哪种工况的Fx最大。1代表最低温,2代表年平均温,3代表大风,4代表覆冰。0位置元素无效。 - MaxFxConditionFlag[0]=1; - for (int t_dangju = inPut.DangJu-1; t_dangju <= inPut.DangJu; t_dangju++) + int[] MaxFxConditionFlag = new int[inPut.DangJu + 1];//记录不同t_dangju下,哪种工况的Fx最大。1代表最低温,2代表年平均温,3代表大风,4代表覆冰。0位置元素无效。 + MaxFxConditionFlag[0] = 1; + for (int t_dangju = inPut.DangJu; t_dangju <= inPut.DangJu; t_dangju++) { double Fx_dangjuZuiDiWen; double Fx_dangjuNianPingJun; @@ -119,7 +176,7 @@ namespace conductortension double maxFx; maxFx = Fx_dangjuZuiDiWen; MaxFxConditionFlag[t_dangju] = 1; - if (maxFx < Fx_dangjuNianPingJun) + if (maxFx < Fx_dangjuNianPingJun) { maxFx = Fx_dangjuNianPingJun; MaxFxConditionFlag[t_dangju] = 2; @@ -134,14 +191,43 @@ namespace conductortension maxFx = Fx_dangjuFuBing; MaxFxConditionFlag[t_dangju] = 4; } - if (MaxFxConditionFlag[t_dangju]!=MaxFxConditionFlag[t_dangju-1] )//有突变,找到了临界档距的范围 + double currentTension = 0; + double currentLoad = 0; + double currentTemperature = 0; + switch (MaxFxConditionFlag[t_dangju]) + { + case 1: + currentLoad = ChuShiZuiDiQiWen[1]; + currentTension = ChuShiZuiDiQiWen[2]; + currentTemperature = ChuShiZuiDiQiWen[0]; + break; + case 2: + currentLoad = ChuShiNianPingJun[1]; + currentTension = ChuShiNianPingJun[2]; + currentTemperature = ChuShiNianPingJun[0]; + break; + case 3: + currentLoad = ChuShiDaFeng[1]; + currentTension = ChuShiDaFeng[2]; + currentTemperature = ChuShiDaFeng[0]; + break; + case 4: + currentLoad = ChuShiFuBing[1]; + currentTension = ChuShiFuBing[2]; + currentTemperature = ChuShiFuBing[0]; + break; + default: + break; + } + //TODO: 目前不会进入这个判断 by 杜孟远 2020.4.18 + if (MaxFxConditionFlag[t_dangju] != MaxFxConditionFlag[t_dangju - 1])//有突变,找到了临界档距的范围 { double criticalSpan; - double formerTension=0; - double formerLoad=0; - double formerTemperature=0; + double formerTension = 0; + double formerLoad = 0; + double formerTemperature = 0; switch (MaxFxConditionFlag[t_dangju - 1]) - { + { case 1: formerLoad = ChuShiZuiDiQiWen[1]; formerTension = ChuShiZuiDiQiWen[2]; @@ -165,45 +251,17 @@ namespace conductortension default: break; } - double currentTension=0; - double currentLoad=0; - double currentTemperature=0; - switch (MaxFxConditionFlag[t_dangju]) - { - case 1: - currentLoad = ChuShiZuiDiQiWen[1]; - currentTension = ChuShiZuiDiQiWen[2]; - currentTemperature = ChuShiZuiDiQiWen[0]; - break; - case 2: - currentLoad = ChuShiNianPingJun[1]; - currentTension = ChuShiNianPingJun[2]; - currentTemperature = ChuShiNianPingJun[0]; - break; - case 3: - currentLoad = ChuShiDaFeng[1]; - currentTension = ChuShiDaFeng[2]; - currentTemperature = ChuShiDaFeng[0]; - break; - case 4: - currentLoad = ChuShiFuBing[1]; - currentTension = ChuShiFuBing[2]; - currentTemperature = ChuShiFuBing[0]; - break; - default: - break; - } - double t1=24 / inPut.MoLiang * (formerTension - currentTension) / inPut.JieMianJi; - double t2=24 * inPut.XianPengZhang * (formerTemperature - currentTemperature) ; - double t3= Math.Pow(formerLoad / formerTension, 2) - Math.Pow(currentLoad / currentTension, 2); - criticalSpan = Math.Sqrt( (t1+ t2)/t3);//TODO:暂时不用 + double t1 = 24 / inPut.MoLiang * (formerTension - currentTension) / inPut.JieMianJi; + double t2 = 24 * inPut.XianPengZhang * (formerTemperature - currentTemperature); + double t3 = Math.Pow(formerLoad / formerTension, 2) - Math.Pow(currentLoad / currentTension, 2); + criticalSpan = Math.Sqrt((t1 + t2) / t3);//TODO:暂时不用 Console.WriteLine("{0}", criticalSpan); } - //Console.WriteLine("{0}:{1}",t_dangju,MaxFxConditionFlag[t_dangju]); + double start_tension = inPut.LaDuanLi / inPut.AnQuan; + ZhangLi = tensionFrmoStateEquation(start_tension,inPut.MoLiang, inPut.XianPengZhang, inPut.JieMianJi, currentLoad, currentTension, currentTemperature, DaiHeZai, inPut.DaiWen, inPut.DangJu); } - Console.ReadKey(); ZhangLi = BaoLiuLiangWei(ZhangLi); return true; }