完成了计算代表档距下控制张力的代码。
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)
|
static void Main(string[] args)
|
||||||
{
|
{
|
||||||
conductortension.Core.calStressLoadNew para = new conductortension.Core.calStressLoadNew();
|
//conductortension.Core.calStressLoadNew para = new conductortension.Core.calStressLoadNew();
|
||||||
double zhangli;
|
//para.DaiWen = 40;
|
||||||
zhangli = 123;
|
//para.DaiBing = 0;
|
||||||
conductortension.Core.CalZhangLi(para, ref zhangli);
|
//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 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 是膨胀系数
|
//alpha 是膨胀系数
|
||||||
//E 弹性模量
|
//E 弹性模量
|
||||||
//area 导线截面
|
//area 导线截面
|
||||||
//t 温度
|
//t 温度
|
||||||
// l 档距
|
// 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)
|
public static bool CalZhangLi(calStressLoadNew inPut, ref double ZhangLi)
|
||||||
|
|
@ -19,7 +83,7 @@ namespace conductortension
|
||||||
//张力=T6
|
//张力=T6
|
||||||
//计算最大使用张力
|
//计算最大使用张力
|
||||||
double ZuiDaShiYongZhangLi; //最大使用张力=计算拉断力*保证破断张力取计算拉断力的/安全系数
|
double ZuiDaShiYongZhangLi; //最大使用张力=计算拉断力*保证破断张力取计算拉断力的/安全系数
|
||||||
ZuiDaShiYongZhangLi = inPut.LaDuanLi * inPut.BaoZhengPoDuanZhangLiXiShu/100 / inPut.AnQuan;
|
ZuiDaShiYongZhangLi = inPut.LaDuanLi * inPut.BaoZhengPoDuanZhangLiXiShu / 100 / inPut.AnQuan;
|
||||||
//ZuiDaShiYongZhangLi = inPut.LaDuanLi / inPut.AnQuan;
|
//ZuiDaShiYongZhangLi = inPut.LaDuanLi / inPut.AnQuan;
|
||||||
//计算温度线膨胀系数
|
//计算温度线膨胀系数
|
||||||
double XianPengZhang = inPut.XianPengZhang;
|
double XianPengZhang = inPut.XianPengZhang;
|
||||||
|
|
@ -33,7 +97,7 @@ namespace conductortension
|
||||||
{
|
{
|
||||||
inPut.NianPingJun = inPut.NianPingJun / 100;
|
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)
|
if (inPut.SheJiFengSuGaoDu == 0)
|
||||||
{
|
{
|
||||||
inPut.SheJiFengSuGaoDu = 10;
|
inPut.SheJiFengSuGaoDu = 10;
|
||||||
|
|
@ -49,13 +113,6 @@ namespace conductortension
|
||||||
{
|
{
|
||||||
return false;
|
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)
|
//一、初始计算数组,5项分别代表:1:气温,2:荷载,3:容许张力,4:P/T,5:Fo=-(T+A*E*a*t)(N)
|
||||||
double[] ChuShiZuiDiQiWen = new double[5]; //最低温
|
double[] ChuShiZuiDiQiWen = new double[5]; //最低温
|
||||||
|
|
@ -101,12 +158,12 @@ namespace conductortension
|
||||||
ChuShiNianPingJun[3] = ChuShiNianPingJun[1] / ChuShiNianPingJun[2];
|
ChuShiNianPingJun[3] = ChuShiNianPingJun[1] / ChuShiNianPingJun[2];
|
||||||
ChuShiDaFeng[3] = ChuShiDaFeng[1] / ChuShiDaFeng[2];
|
ChuShiDaFeng[3] = ChuShiDaFeng[1] / ChuShiDaFeng[2];
|
||||||
ChuShiFuBing[3] = ChuShiFuBing[1] / ChuShiFuBing[2];
|
ChuShiFuBing[3] = ChuShiFuBing[1] / ChuShiFuBing[2];
|
||||||
|
|
||||||
//计算4个工况下的Fx by 杜孟远2020.4.17
|
//计算4个工况下的Fx by 杜孟远2020.4.17
|
||||||
//t_dangju 试探最大Fx时使用的档距
|
//t_dangju 试探最大Fx时使用的档距
|
||||||
int[] MaxFxConditionFlag = new int[inPut.DangJu+1];//记录不同t_dangju下,哪种工况的Fx最大。1代表最低温,2代表年平均温,3代表大风,4代表覆冰。0位置元素无效。
|
int[] MaxFxConditionFlag = new int[inPut.DangJu + 1];//记录不同t_dangju下,哪种工况的Fx最大。1代表最低温,2代表年平均温,3代表大风,4代表覆冰。0位置元素无效。
|
||||||
MaxFxConditionFlag[0]=1;
|
MaxFxConditionFlag[0] = 1;
|
||||||
for (int t_dangju = inPut.DangJu-1; t_dangju <= inPut.DangJu; t_dangju++)
|
for (int t_dangju = inPut.DangJu; t_dangju <= inPut.DangJu; t_dangju++)
|
||||||
{
|
{
|
||||||
double Fx_dangjuZuiDiWen;
|
double Fx_dangjuZuiDiWen;
|
||||||
double Fx_dangjuNianPingJun;
|
double Fx_dangjuNianPingJun;
|
||||||
|
|
@ -119,7 +176,7 @@ namespace conductortension
|
||||||
double maxFx;
|
double maxFx;
|
||||||
maxFx = Fx_dangjuZuiDiWen;
|
maxFx = Fx_dangjuZuiDiWen;
|
||||||
MaxFxConditionFlag[t_dangju] = 1;
|
MaxFxConditionFlag[t_dangju] = 1;
|
||||||
if (maxFx < Fx_dangjuNianPingJun)
|
if (maxFx < Fx_dangjuNianPingJun)
|
||||||
{
|
{
|
||||||
maxFx = Fx_dangjuNianPingJun;
|
maxFx = Fx_dangjuNianPingJun;
|
||||||
MaxFxConditionFlag[t_dangju] = 2;
|
MaxFxConditionFlag[t_dangju] = 2;
|
||||||
|
|
@ -134,14 +191,43 @@ namespace conductortension
|
||||||
maxFx = Fx_dangjuFuBing;
|
maxFx = Fx_dangjuFuBing;
|
||||||
MaxFxConditionFlag[t_dangju] = 4;
|
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 criticalSpan;
|
||||||
double formerTension=0;
|
double formerTension = 0;
|
||||||
double formerLoad=0;
|
double formerLoad = 0;
|
||||||
double formerTemperature=0;
|
double formerTemperature = 0;
|
||||||
switch (MaxFxConditionFlag[t_dangju - 1])
|
switch (MaxFxConditionFlag[t_dangju - 1])
|
||||||
{
|
{
|
||||||
case 1:
|
case 1:
|
||||||
formerLoad = ChuShiZuiDiQiWen[1];
|
formerLoad = ChuShiZuiDiQiWen[1];
|
||||||
formerTension = ChuShiZuiDiQiWen[2];
|
formerTension = ChuShiZuiDiQiWen[2];
|
||||||
|
|
@ -165,45 +251,17 @@ namespace conductortension
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
double currentTension=0;
|
double t1 = 24 / inPut.MoLiang * (formerTension - currentTension) / inPut.JieMianJi;
|
||||||
double currentLoad=0;
|
double t2 = 24 * inPut.XianPengZhang * (formerTemperature - currentTemperature);
|
||||||
double currentTemperature=0;
|
double t3 = Math.Pow(formerLoad / formerTension, 2) - Math.Pow(currentLoad / currentTension, 2);
|
||||||
switch (MaxFxConditionFlag[t_dangju])
|
criticalSpan = Math.Sqrt((t1 + t2) / t3);//TODO:暂时不用
|
||||||
{
|
|
||||||
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:暂时不用
|
|
||||||
Console.WriteLine("{0}", criticalSpan);
|
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);
|
ZhangLi = BaoLiuLiangWei(ZhangLi);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue