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

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

134
core.cs
View File

@ -4,6 +4,70 @@ 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 导线截面
@ -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/T5:Fo=-(T+A*E*a*t)(N) //一、初始计算数组,5项分别代表:1:气温2:荷载3:容许张力4:P/T5:Fo=-(T+A*E*a*t)(N)
double[] ChuShiZuiDiQiWen = new double[5]; //最低温 double[] ChuShiZuiDiQiWen = new double[5]; //最低温
@ -106,7 +163,7 @@ namespace conductortension
//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;
@ -134,6 +191,35 @@ namespace conductortension
maxFx = Fx_dangjuFuBing; maxFx = Fx_dangjuFuBing;
MaxFxConditionFlag[t_dangju] = 4; MaxFxConditionFlag[t_dangju] = 4;
} }
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])//有突变,找到了临界档距的范围 if (MaxFxConditionFlag[t_dangju] != MaxFxConditionFlag[t_dangju - 1])//有突变,找到了临界档距的范围
{ {
double criticalSpan; double criticalSpan;
@ -165,34 +251,6 @@ namespace conductortension
default: default:
break; 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 t1 = 24 / inPut.MoLiang * (formerTension - currentTension) / inPut.JieMianJi;
double t2 = 24 * inPut.XianPengZhang * (formerTemperature - currentTemperature); double t2 = 24 * inPut.XianPengZhang * (formerTemperature - currentTemperature);
double t3 = Math.Pow(formerLoad / formerTension, 2) - Math.Pow(currentLoad / currentTension, 2); double t3 = Math.Pow(formerLoad / formerTension, 2) - Math.Pow(currentLoad / currentTension, 2);
@ -200,10 +258,10 @@ namespace conductortension
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;
} }