完成了计算代表档距下控制张力的代码。
This commit is contained in:
parent
2dd85480ec
commit
c84261e24e
12
Program.cs
12
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);
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
|||
168
core.cs
168
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;
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue