完成了计算代表档距下控制张力的代码。

This commit is contained in:
facat 2020-04-18 10:55:58 +08:00
parent 2dd85480ec
commit c84261e24e
2 changed files with 121 additions and 59 deletions

View File

@ -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);
}
}

168
core.cs
View File

@ -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/T5: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;
}