Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "stdafx.h"
- #include<iostream>
- using namespace std;
- #include <stdio.h>
- #include <stdlib.h>
- #include <stdlib.h>
- #include"math.h"
- float swap(float a, float b)
- {
- float c;
- c = a;
- a = b;
- b = c;
- return 0;
- }
- //二分法求根
- double boots_q[20];
- float coef[20];//系数
- float *p;//系数
- double fabs(double x)
- {
- return (x < 0) ? -x : x;
- }
- double Equation(double x)
- {
- double z;
- z = pow(x, 4)**p+ pow(x, 3)**(p+1)+ pow(x, 2)**(p+2) + x**(p+3) + *(p+4);/*更改为实际多项式*/
- return(z);
- }
- int BinSearchRoot(double a, double b, double h, double eps, double x[], int m) /*用二分法计算非线性方程的实根*/
- /*参数意义:
- a 要求的根的下界
- b 要求的根的上界,即:所求的根落在区间 [a,b]之内
- h 递进的步长
- eps 精度
- x 根的值
- m 预计的根的个数*/
- {
- int n, js;
- double z, y, z1, y1, z0, y0;
- n = 0; z = a; y = Equation(z);
- while ((z <= b + h / 2.0) && (n != m)) /*对给定步长的子区间进行搜索*/
- {
- if (fabs(y)<eps) /*当前的判定点是方程的根*/
- {
- n = n + 1;
- x[n - 1] = z;
- z = z + h / 2.0;
- y = Equation(z);
- }
- else /*当前点不是方程的根*/
- {
- z1 = z + h;
- y1 = Equation(z1);
- if (fabs(y1)<eps) /*下一个点是方程的根*/
- {
- n = n + 1;
- x[n - 1] = z1;
- z = z1 + h / 2.0;
- y = Equation(z);
- }
- else if (y*y1>0.0) /*该区间内无根*/
- {
- y = y1; z = z1;
- }
- else /*该区间内有根*/
- {
- js = 0;/*标志,0表示未找到根,1表示已经确定了根*/
- while (js == 0)
- {
- if (fabs(z1 - z)<eps) /*区间的长度小于给定的精度,可以当作已经找到了根*/
- {
- n = n + 1;
- x[n - 1] = (z1 + z) / 2.0; /*把区间的中位值作为根*/
- z = z1 + h / 2.0; /*把寻找的位置放到下一个区间内*/
- y = Equation(z);
- js = 1; /*在当前区间内已经找到了根*/
- }
- else /*区间比给定的精度大,则进行二分*/
- {
- z0 = (z1 + z) / 2.0; /*区间二分*/
- y0 = Equation(z0);
- if (fabs(y0)<eps) /*z0位置为根*/
- {
- x[n] = z0;
- n = n + 1;
- js = 1;
- z = z0 + h / 2.0;
- y = Equation(z);
- }
- else if ((y*y0)<0.0) /*[z,z0]内有根*/
- {
- z1 = z0; y1 = y0;
- }
- else { z = z0; y = y0; }
- }
- }
- }
- }
- }
- return(n); /*返回根的个数*/
- }
- int boot_q()
- {
- int i, n;
- static int m = 6;
- static double x[6];
- // system("cls");
- n = BinSearchRoot(-100.0, 150.0, 0.1, 0.000001, x, m);
- printf("\nThe function has %d roots, they are:\n", n);/*输出根的个数*/
- for (i = 0; i <= n - 1; i++)
- {
- printf("x(%d)=%10.7f\n", i, x[i]);
- boots_q[i] = x[i];
- }
- //system("pause");
- return 0;
- }
- //二分法求多项式的
- /*float Va = 6.0, Acca = 3.0, Deca = 2.0, J1 = 3.0, J2 = 2.0 ,step = 0.01;*/
- float motioncase1(float Va,float Acca,float Deca,float Tacc,float Tdec,float S,float step)
- {
- float vmax;
- float J1 = Acca / Tacc;
- float J2 = Deca / Tdec;
- Tacc = ceil(Acca / (J1*step))*step;
- Tdec = ceil(Deca / (J2*step))*step;
- float T1 = ceil((Va / (Tacc*J1) - Tacc) / step)*step;
- J1 = Va / (pow(Tacc,2) + T1*Tacc);
- float T2 = ceil((Va / (Tdec*J2) - Tdec) / step)*step;
- J2 = Va / (pow(Tdec,2) + T2*Tdec);//step 2
- vmax = (pow(Tacc, 2) + T1*Tacc)*J1;
- float T3 = ceil((S / (pow(Tacc,2) + T1*Tacc) / J1 - (Tacc + T1 / 2 + Tdec + T2 / 2)) / step)*step;
- // float S1 = (Tacc + T1 / 2)*vmax + (Tdec + T2 / 2)*vmax + T3*vmax;
- J1 = S / (pow(Tacc, 2) + T1*Tacc) / (Tacc + T1 / 2 + Tdec + T2 / 2 + T3);
- J2 = (pow(Tacc, 2) + T1*Tacc)*J1 / (pow(Tdec, 2) + T2*Tdec);
- float C1 = Va*Tacc + Va*T1 / 2 + Va*Tdec + Va*T2 / 2;
- // cout << "临界位移C1" << endl;
- // cout << C1<< endl;
- T1 = (Va - Acca*Tacc) / Acca;
- T2 = (Va - Deca*Tdec) / Deca;
- T3 = (S - C1) / Va;
- float T = 2 * (Tacc + Tdec) + T1 + T2 + T3;
- /*if (rev == 1)
- {
- swap(J1, J2);
- swap(T1,T2);
- swap(Dec,Acc);
- swap(Tacc, Tdec);
- }*/
- int size = T / step;
- float t[10000],a[10000] = { 0 };
- t[0] = 0;
- for (int i = 0; i <= size; i++)
- {
- t[i + 1] = t[i] + step;
- }
- //cout << T1 << endl;; cout << T2 << endl;
- for (int i = 0; i <= size; i++)
- {
- if (t[i] <= Tacc)
- a[i] = t[i]*J1;
- if(Tacc<t[i] && t[i]<= Tacc + T1)
- a[i] = Acca;
- if(Tacc + T1<t[i] && t[i] <= 2 * Tacc + T1)
- a[i] = Acca - J1*(t[i] - Tacc - T1);
- if(2 * Tacc + T1<t[i] && t[i] <= 2 * Tacc + T1 + T3)
- a[i] = 0;
- if(2 * Tacc + T1 + T3<t[i] && t[i] <= 2 * Tacc + T1 + T3 + Tdec)
- a[i] = -J2*(t[i] - 2 * Tacc - T1 - T3);
- if(2 * Tacc + T1 + T3 + Tdec<t[i]&& t[i] <= 2 * Tacc + T1 + T2 + Tdec + T3)
- a[i] = -Deca;
- if(2 * Tacc + T1 + T2 + Tdec + T3<t[i])
- a[i] = -Deca + J2*(t[i] - (2 * Tacc + T1 + T2 + Tdec + T3));
- //printf("%f+", a[i]);
- }
- float v[10000];
- for (int i = 0; i <= size; i++)
- {
- float ss=0;
- for (int j = 0; j <= i; j++)
- {
- ss = ss + a[j] * step;
- }
- v[i] = ss;
- //printf("%f+", v[i]);
- }
- float d[10000];
- printf("位移变化\n");
- for (int i = 0; i <= size; i++)
- {
- float ss = 0;
- for (int j = 0; j <= i; j++)
- {
- ss = ss + v[j] * step;
- }
- d[i] = ss;
- printf("%f__", d[i]);
- }
- return 0;
- }
- float motioncase2(float Va, float Acca, float Deca, float Tacc, float Tdec, float S, float step)
- {
- float vmax,T1,T2,T3;
- float J1 = Acca / Tacc;
- float J2 = Deca / Tdec;
- Tacc = ceil(Acca / (J1*step))*step;
- Tdec = ceil(Deca / (J2*step))*step;
- float pa = 1 / Acca + 1 / Deca;
- float pb = Tacc + Tdec;
- float pc = -2 * S;
- vmax = (-pb +pow((pow(pb, 2) - 4 * pa*pc), 0.5)) / (2 * pa);
- cout << "\nvmax的值为" << endl;
- cout << vmax << endl;
- T1 = ceil((vmax / Acca - Tacc)/step)*step;
- T2 = ceil((vmax / Deca - Tdec)/step)*step;
- vmax = S / (Tacc + T1 / 2 + Tdec + Tdec + T2 / 2);
- J1 = vmax / (Tacc*Tacc + T1*Tacc);
- J2 = vmax / (Tdec*Tdec + T2*Tdec);
- float C2 = Acca*Tacc*Tdec + Acca*Tacc*T2 / 2 + Acca*pow(Tacc, 2);
- cout << "C2的值为" << endl;
- cout << C2<< endl;
- //%求解C2完成
- T3 = 0;
- float T = 2 * (Tacc + Tdec) + T1 + T2 + T3;
- int size = T / step;
- float t[10000], a[10000] = { 0 };
- t[0] = 0;
- for (int i = 0; i <= size; i++)
- {
- t[i + 1] = t[i] + step;
- }
- printf("加速度变化\n");
- //cout << T1 << endl;; cout << T2 << endl;
- for (int i = 0; i <= size; i++)
- {
- if (t[i] <= Tacc)
- a[i] = t[i] * J1;
- if (Tacc<t[i] && t[i] <= Tacc + T1)
- a[i] = Acca;
- if (Tacc + T1<t[i] && t[i] <= 2 * Tacc + T1)
- a[i] = Acca - J1*(t[i] - Tacc - T1);
- if (2 * Tacc + T1<t[i] && t[i] <= 2 * Tacc + T1 + T3)
- a[i] = 0;
- if (2 * Tacc + T1 + T3<t[i] && t[i] <= 2 * Tacc + T1 + T3 + Tdec)
- a[i] = -J2*(t[i] - 2 * Tacc - T1 - T3);
- if (2 * Tacc + T1 + T3 + Tdec<t[i] && t[i] <= 2 * Tacc + T1 + T2 + Tdec + T3)
- a[i] = -Deca;
- if (2 * Tacc + T1 + T2 + Tdec + T3<t[i])
- a[i] = -Deca + J2*(t[i] - (2 * Tacc + T1 + T2 + Tdec + T3));
- printf("%f__", a[i]);
- }
- printf("速度变化\n");
- float v[10000];
- for (int i = 0; i <= size; i++)
- {
- float ss = 0;
- for (int j = 0; j <= i; j++)
- {
- ss = ss + a[j] * step;
- }
- v[i] = ss;
- printf("%f__", v[i]);
- }
- float d[10000];
- printf("位移变化\n");
- for (int i = 0; i <= size; i++)
- {
- float ss = 0;
- for (int j = 0; j <= i; j++)
- {
- ss = ss + v[j] * step;
- }
- d[i] = ss;
- printf("%f__", d[i]);
- }
- return 0;
- }
- float motioncase3(float Va, float Acca, float Deca, float Tacc, float Tdec, float S, float step)
- {
- float vmax, T1, T2, T3,J1,J2;
- J2 = Deca / Tdec;
- J1=Acca/Tacc;/////////
- Tdec = ceil(Deca / (J2*step))*step;
- p = coef;
- *p = pow(J1,2)/(2*J2*Tdec);
- *(p+1)=J1;
- *(p+2) = J1*Tdec/2;
- *(p+3)=0;
- *(p+4) = -S;
- boot_q();
- double p= boots_q[1];
- Tacc = p;
- T2 = ceil((J1*pow(Tacc, 2) / (J2*Tdec) - Tdec)/step)*step;
- J2 = pow(Tacc, 2)*J1 / (Tdec*(Tdec + T2));
- J1 = S / (pow(Tacc, 2)*(Tacc + Tdec + T2 / 2));
- //T2 = J1*pow(Tacc, 2) / (J2*Tdec) - Tdec;
- cout << "TAcc=" << endl;
- cout << p << endl;
- //float T2 = ceil((J1*pow(Tacc,2) / J2*Tdec - Tdec) / step)*step;
- T1 = 0;
- T3 = 0;
- float T = 2 * (Tacc + Tdec) + T1 + T2 + T3;
- float Acc = Tacc*J1;
- float Dec = J2*Tdec;
- int size = T / step;
- float t[10000], a[10000] = { 0 };
- t[0] = 0;
- for (int i = 0; i <= size; i++)
- {
- t[i + 1] = t[i] + step;
- }
- printf("加速度变化\n");
- //cout << T1 << endl;; cout << T2 << endl;
- for (int i = 0; i <= size; i++)
- {
- if (t[i] <= Tacc)
- a[i] = t[i] * J1;
- if (Tacc<t[i] && t[i] <= Tacc + T1)
- a[i] = Acc;
- if (Tacc + T1<t[i] && t[i] <= 2 * Tacc + T1)
- a[i] = Acc - J1*(t[i] - Tacc - T1);
- if (2 * Tacc + T1<t[i] && t[i] <= 2 * Tacc + T1 + T3)
- a[i] = 0;
- if (2 * Tacc + T1 + T3<t[i] && t[i] <= 2 * Tacc + T1 + T3 + Tdec)
- a[i] = -J2*(t[i] - 2 * Tacc - T1 - T3);
- if (2 * Tacc + T1 + T3 + Tdec<t[i] && t[i] <= 2 * Tacc + T1 + T2 + Tdec + T3)
- a[i] = -Dec;
- if (2 * Tacc + T1 + T2 + Tdec + T3<t[i])
- a[i] = -Dec + J2*(t[i] - (2 * Tacc + T1 + T2 + Tdec + T3));
- printf("%f+", a[i]);
- }
- printf("速度变化\n");
- float v[10000];
- for (int i = 0; i <= size; i++)
- {
- float ss = 0;
- for (int j = 0; j <= i; j++)
- {
- ss = ss + a[j] * step;
- }
- v[i] = ss;
- printf("%f+", v[i]);
- }
- float d[10000];
- printf("位移变化\n");
- for (int i = 0; i <= size; i++)
- {
- float ss = 0;
- for (int j = 0; j <= i; j++)
- {
- ss = ss + v[j] * step;
- }
- d[i] = ss;
- printf("%f__", d[i]);
- }
- return 0;
- }
- float motioncase4(float Va, float Acca, float Deca, float Tacc, float Tdec, float S, float step)
- {
- float vmax,Acc,Dec;
- float g = 0.3333333;
- float J1 = Acca / Tacc;
- float J2 = Deca / Tdec;
- Tdec = ceil( ( pow( S /(J2*(1 + pow((J2 / J1) ,0.5))) , g) )/ step )*step;
- Tacc = ceil(pow((J2 / J1) , 0.5)*Tdec / step)*step;
- cout << Tacc << endl;
- cout << Tdec << endl;
- J1 = S / (pow(Tacc, 3) + pow(Tacc, 2)*Tdec);
- J2 = pow(Tacc, 2)*J1 / pow(Tdec, 2);
- //Tdec = ceil((S / pow((J2*(1 + pow((J2 / J1), 0.5))), 1 / 3)));
- Acc = Tacc*J1;
- Dec = Tdec*J2;
- float T1 = 0, T2 = 0, T3 = 0;
- float T = 2 * (Tacc + Tdec) + T1 + T2 + T3;
- int size = T / step;
- float t[10000], a[10000] = { 0 };
- t[0] = 0;
- for (int i = 0; i <= size; i++)
- {
- t[i + 1] = t[i] + step;
- }
- printf("加速度变化\n");
- //cout << T1 << endl;; cout << T2 << endl;
- for (int i = 0; i <= size; i++)
- {
- if (t[i] <= Tacc)
- a[i] = t[i] * J1;
- if (Tacc<t[i] && t[i] <= Tacc + T1)
- a[i] = Acc;
- if (Tacc + T1<t[i] && t[i] <= 2 * Tacc + T1)
- a[i] = Acc - J1*(t[i] - Tacc - T1);
- if (2 * Tacc + T1<t[i] && t[i] <= 2 * Tacc + T1 + T3)
- a[i] = 0;
- if (2 * Tacc + T1 + T3<t[i] && t[i] <= 2 * Tacc + T1 + T3 + Tdec)
- a[i] = -J2*(t[i] - 2 * Tacc - T1 - T3);
- if (2 * Tacc + T1 + T3 + Tdec<t[i] && t[i] <= 2 * Tacc + T1 + T2 + Tdec + T3)
- a[i] = -Dec;
- if (2 * Tacc + T1 + T2 + Tdec + T3<t[i])
- a[i] = -Dec + J2*(t[i] - (2 * Tacc + T1 + T2 + Tdec + T3));
- printf("%f__", a[i]);
- }
- printf("速度变化\n");
- float v[10000];
- for (int i = 0; i <= size; i++)
- {
- float ss = 0;
- for (int j = 0; j <= i; j++)
- {
- ss = ss + a[j] * step;
- }
- v[i] = ss;
- printf("%f__", v[i]);
- }
- float d[10000];
- printf("位移变化\n");
- for (int i = 0; i <= size; i++)
- {
- float ss = 0;
- for (int j = 0; j <= i; j++)
- {
- ss = ss + v[j] * step;
- }
- d[i] = ss;
- printf("%f__", d[i]);
- }
- return 0;
- }
- float motioncase5(float Va, float Acca, float Deca, float Tacc, float Tdec , float S, float step)
- {
- float J1,J2,vmax;
- J1 =Va/ Tacc/Tacc;
- Tacc = ceil(pow((Va / J1) , 0.5) / step)*step;
- J2 = Deca / Tdec;
- Tdec = ceil(Deca / J2 / step)*step;
- float T2 = ceil((Va / (Tdec*J2) - Tdec) / step)*step;
- J2 = Va / (Tdec*(T2 + Tdec));
- float T3 = ceil((S / (pow(Tacc,2) * J1) - Tacc - Tdec - T2 / 2) / step)*step;
- J1 = S / (pow(Tacc, 2)*(T3 + Tacc + Tdec + T2 / 2));
- J2 =pow( Tacc ,2) * J1 / (Tdec*(T2 + Tdec));
- float T1 = 0;
- Tacc = pow(Va/ J1,0.5);
- T2 = (Va - Tdec*Deca) / Deca;
- float C4 = Va*Tdec+Va*T2/2+pow(Va,1.5)/pow(J1,0.5);
- //C4 = 6.34808;
- T3 = (S-C4)/Va;
- //J1 = S / (pow(Tacc , 2) * (T3 + Tacc + Tdec + T2 / 2));
- //J2 = pow(Tacc,2) * J1 / (Tdec*(T2 + Tdec));
- cout << T3 << endl;
- cout << C4<< endl;
- float T = 2 * (Tacc + Tdec) + T1 + T2 + T3;
- int size = T / step;
- float t[10000], a[10000] = { 0 };
- t[0] = 0;
- for (int i = 0; i <= size; i++)
- {
- t[i + 1] = t[i] + step;
- }
- printf("加速度变化\n");
- //cout << T1 << endl;; cout << T2 << endl;
- for (int i = 0; i <= size; i++)
- {
- if (t[i] <= Tacc)
- a[i] = t[i] * J1;
- if (Tacc<t[i] && t[i] <= Tacc + T1)
- a[i] = J1*Tacc;
- if (Tacc + T1<t[i] && t[i] <= 2 * Tacc + T1)
- a[i] = J1*Tacc - J1*(t[i] - Tacc - T1);
- if (2 * Tacc + T1<t[i] && t[i] <= 2 * Tacc + T1 + T3)
- a[i] = 0;
- if (2 * Tacc + T1 + T3<t[i] && t[i] <= 2 * Tacc + T1 + T3 + Tdec)
- a[i] = -J2*(t[i] - 2 * Tacc - T1 - T3);
- if (2 * Tacc + T1 + T3 + Tdec<t[i] && t[i] <= 2 * Tacc + T1 + T2 + Tdec + T3)
- a[i] = -J2*Tdec;
- if (2 * Tacc + T1 + T2 + Tdec + T3<t[i])
- a[i] = -J2*Tdec + J2*(t[i] - (2 * Tacc + T1 + T2 + Tdec + T3));
- printf("%f__", a[i]);
- }
- printf("速度变化\n");
- float v[10000];
- for (int i = 0; i <= size; i++)
- {
- float ss = 0;
- for (int j = 0; j <= i; j++)
- {
- ss = ss + a[j] * step;
- }
- v[i] = ss;
- printf("%f__", v[i]);
- }
- float d[10000];
- printf("位移变化\n");
- for (int i = 0; i <= size; i++)
- {
- float ss = 0;
- for (int j = 0; j <= i; j++)
- {
- ss = ss + v[j] * step;
- }
- d[i] = ss;
- printf("%f__", d[i]);
- }
- return 0;
- }
- float motioncase6(float Va, float Acca, float Deca, float Tacc, float Tdec, float S, float step)
- {
- float vmax,J1,J2;
- J1 = Deca / Tdec;
- J2 = Deca / Tdec;
- Tdec = ceil(Deca / J2/step)*step;
- p = coef;
- *p = pow(J1,2) / (2 * J2*Tdec);
- *(p + 1) =J1 ;
- *(p + 2) = J1*Tdec / 2;
- *(p + 3) = 0;
- *(p + 4) = -S;
- //
- boot_q();
- Tacc = boots_q[1];
- cout << Tacc << endl;
- float T2 = ceil((J1*pow(Tacc, 2) / J2 / Tdec - Tdec) / step)*step;
- J2 = Tacc*Tacc*J1 / (Tdec*(Tdec + T2));
- J1 = S / (Tacc*Tacc*(Tacc + Tdec + T2 / 2));
- float T1 = 0; float T3 = 0;
- float T = 2 * (Tacc + Tdec) + T1 + T2 + T3;
- int size = T / step;
- float t[10000], a[10000] = { 0 };
- t[0] = 0;
- for (int i = 0; i <= size; i++)
- {
- t[i + 1] = t[i] + step;
- }
- printf("加速度变化\n");
- //cout << T1 << endl;; cout << T2 << endl;
- for (int i = 0; i <= size; i++)
- {
- if (t[i] <= Tacc)
- a[i] = t[i] * J1;
- if (Tacc<t[i] && t[i] <= Tacc + T1)
- a[i] = J1*Tacc;
- if (Tacc + T1<t[i] && t[i] <= 2 * Tacc + T1)
- a[i] = J1*Tacc - J1*(t[i] - Tacc - T1);
- if (2 * Tacc + T1<t[i] && t[i] <= 2 * Tacc + T1 + T3)
- a[i] = 0;
- if (2 * Tacc + T1 + T3<t[i] && t[i] <= 2 * Tacc + T1 + T3 + Tdec)
- a[i] = -J2*(t[i] - 2 * Tacc - T1 - T3);
- if (2 * Tacc + T1 + T3 + Tdec<t[i] && t[i] <= 2 * Tacc + T1 + T2 + Tdec + T3)
- a[i] = -J2*Tdec;
- if (2 * Tacc + T1 + T2 + Tdec + T3<t[i])
- a[i] = -J2*Tdec + J2*(t[i] - (2 * Tacc + T1 + T2 + Tdec + T3));
- printf("%f__", a[i]);
- }
- printf("速度变化\n");
- float v[10000];
- for (int i = 0; i <= size; i++)
- {
- float ss = 0;
- for (int j = 0; j <= i; j++)
- {
- ss = ss + a[j] * step;
- }
- v[i] = ss;
- printf("%f__", v[i]);
- }
- float d[10000];
- printf("位移变化\n");
- for (int i = 0; i <= size; i++)
- {
- float ss = 0;
- for (int j = 0; j <= i; j++)
- {
- ss = ss + v[j] * step;
- }
- d[i] = ss;
- printf("%f__", d[i]);
- }
- return 0;
- }
- float motioncase7(float Va, float Acca, float Deca, float Tacc, float Tdec, float S, float step)
- {
- float Acc ,Dec,vmax,J1,J2;
- J1 = Acca / Tacc; J2 = Deca / Tdec;
- Tdec = ceil(pow(S / J2 / (1 + pow(J2 / J1, 0.5)),0.33333333) / step)*step;
- Tacc = ceil(pow(J2 / J1, 0.5)*pow(S / J2 / (1 + pow(J2 / J1, 0.5)), 0.333333333) / step)*step;
- J1 = S / (pow(Tacc, 3) + pow(Tacc, 2)*Tdec);
- J2 = J1*pow(Tacc, 2) / pow(Tdec, 2);
- Tdec = pow(S / J2 / (1 + pow(J2 / J1, 0.5)), 0.3333333);
- Tacc = pow(J2 / J1, 0.5)*Tdec;
- Acc = Tacc*J1;
- Dec = Tdec*J2;
- cout << Tacc << endl;
- cout << Tdec << endl;
- float T1 = 0; float T2 = 0; float T3 = 0;
- float T = 2 * (Tacc + Tdec) + T1 + T2 + T3;
- cout << T<< endl;
- int size = T / step;
- float t[10000], a[10000] = { 0 };
- t[0] = 0;
- for (int i = 0; i <= size; i++)
- {
- t[i + 1] = t[i] + step;
- }
- printf("加速度变化\n");
- //cout << T1 << endl;; cout << T2 << endl;
- for (int i = 0; i <= size; i++)
- {
- if (t[i] <= Tacc)
- a[i] = t[i] * J1;
- if (Tacc<t[i] && t[i] <= Tacc + T1)
- a[i] = Acc;
- if (Tacc + T1<t[i] && t[i] <= 2 * Tacc + T1)
- a[i] = Acc - J1*(t[i] - Tacc - T1);
- if (2 * Tacc + T1<t[i] && t[i] <= 2 * Tacc + T1 + T3)
- a[i] = 0;
- if (2 * Tacc + T1 + T3<t[i] && t[i] <= 2 * Tacc + T1 + T3 + Tdec)
- a[i] = -J2*(t[i] - 2 * Tacc - T1 - T3);
- if (2 * Tacc + T1 + T3 + Tdec<t[i] && t[i] <= 2 * Tacc + T1 + T2 + Tdec + T3)
- a[i] = -Dec;
- if (2 * Tacc + T1 + T2 + Tdec + T3<t[i])
- a[i] = -Dec + J2*(t[i] - (2 * Tacc + T1 + T2 + Tdec + T3));
- printf("%f__", a[i]);
- }
- printf("速度变化\n");
- float v[10000];
- for (int i = 0; i <= size; i++)
- {
- float ss = 0;
- for (int j = 0; j <= i; j++)
- {
- ss = ss + a[j] * step;
- }
- v[i] = ss;
- printf("%f__", v[i]);
- }
- float d[10000];
- printf("位移变化\n");
- for (int i = 0; i <= size; i++)
- {
- float ss = 0;
- for (int j = 0; j <= i; j++)
- {
- ss = ss + v[j] * step;
- }
- d[i] = ss;
- printf("%f__", d[i]);
- }
- return 0;
- }
- float motioncase8(float Va, float Acca, float Deca, float Tacc, float Tdec, float S, float step)
- {
- float J1 = Va/Tacc/Tacc;float J2=Va/Tdec/Tdec;
- Tacc = ceil(pow(Va / J1, 0.5) / step)*step;
- Tdec = ceil(pow(Va / J2, 0.5) / step)*step;
- float T1 = 0; float T2 = 0;
- float T3 = ceil((S - J1*pow(Tacc, 3) - J2*pow(Tdec, 3)) / J1 / pow(Tacc, 2) / step)*step;
- J1 = S / (Tacc + Tdec + T3) / pow(Tacc, 2);
- J2 = J1*pow(Tacc, 2) / pow(Tdec, 2);
- Tacc = pow(Va / J1, 0.5) ;
- Tdec = pow(Va / J2, 0.5);
- float C6 = pow(Va,1.5) / (pow(J1,-0.5) + pow(J2,-0.5));
- //T3= (S - C6) / Va;
- float Acc = J1*Tacc;
- float Dec = J2*Tdec;
- float T = 2 * (Tacc + Tdec) + T1 + T2 + T3;
- cout << S << endl;
- cout << C6 << endl;
- int size = T / step;
- float t[10000], a[10000] = { 0 };
- t[0] = 0;
- for (int i = 0; i <= size; i++)
- {
- t[i + 1] = t[i] + step;
- }
- printf("加速度变化\n");
- //cout << T1 << endl;; cout << T2 << endl;
- for (int i = 0; i <= size; i++)
- {
- if (t[i] <= Tacc)
- a[i] = t[i] * J1;
- if (Tacc<t[i] && t[i] <= Tacc + T1)
- a[i] = Acc;
- if (Tacc + T1<t[i] && t[i] <= 2 * Tacc + T1)
- a[i] = Acc - J1*(t[i] - Tacc - T1);
- if (2 * Tacc + T1<t[i] && t[i] <= 2 * Tacc + T1 + T3)
- a[i] = 0;
- if (2 * Tacc + T1 + T3<t[i] && t[i] <= 2 * Tacc + T1 + T3 + Tdec)
- a[i] = -J2*(t[i] - 2 * Tacc - T1 - T3);
- if (2 * Tacc + T1 + T3 + Tdec<t[i] && t[i] <= 2 * Tacc + T1 + T2 + Tdec + T3)
- a[i] = -Dec;
- if (2 * Tacc + T1 + T2 + Tdec + T3<t[i])
- a[i] = -Dec + J2*(t[i] - (2 * Tacc + T1 + T2 + Tdec + T3));
- printf("%f__", a[i]);
- }
- printf("速度变化\n");
- float v[10000];
- for (int i = 0; i <= size; i++)
- {
- float ss = 0;
- for (int j = 0; j <= i; j++)
- {
- ss = ss + a[j] * step;
- }
- v[i] = ss;
- printf("%f__", v[i]);
- }
- float d[10000];
- printf("位移变化\n");
- for (int i = 0; i <= size; i++)
- {
- float ss = 0;
- for (int j = 0; j <= i; j++)
- {
- ss = ss + v[j] * step;
- }
- d[i] = ss;
- printf("%f__", d[i]);
- }
- return 0;
- }
- float motioncase9(float Va, float Acca, float Deca, float Tacc, float Tdec, float S, float step)
- {
- float Acc , Dec;
- float J1=Acca / Tacc;
- float J2 = Deca / Tdec;
- Tdec = ceil(pow(S / J2 / (1 + pow(J2 / J1, 0.5)), 0.33333333) / step)*step;
- Tacc = ceil(pow(J2 / J1, 0.5)*pow(S / J2 / (1 + pow(J2 / J1, 0.5)), 0.333333333) / step)*step;
- J1 = S / (pow(Tacc, 3) + pow(Tacc, 2)*Tdec);
- J2 = J1*pow(Tacc, 2) / pow(Tdec, 2);
- Tdec = pow(S / J2 / (1 + pow(J2 / J1, 0.5)), 0.3333333);
- Tacc = pow(J2 / J1, 0.5)*Tdec;
- Acc = Tacc*J1;
- Dec = Tdec*J2;
- cout << Tacc << endl;
- cout << Tdec << endl;
- float T1 = 0; float T2 = 0; float T3 = 0;
- float T = 2 * (Tacc + Tdec) + T1 + T2 + T3;
- cout << T << endl;
- int size = T / step;
- float t[10000], a[10000] = { 0 };
- t[0] = 0;
- for (int i = 0; i <= size; i++)
- {
- t[i + 1] = t[i] + step;
- }
- printf("加速度变化\n");
- //cout << T1 << endl;; cout << T2 << endl;
- for (int i = 0; i <= size; i++)
- {
- if (t[i] <= Tacc)
- a[i] = t[i] * J1;
- if (Tacc<t[i] && t[i] <= Tacc + T1)
- a[i] = Acc;
- if (Tacc + T1<t[i] && t[i] <= 2 * Tacc + T1)
- a[i] = Acc - J1*(t[i] - Tacc - T1);
- if (2 * Tacc + T1<t[i] && t[i] <= 2 * Tacc + T1 + T3)
- a[i] = 0;
- if (2 * Tacc + T1 + T3<t[i] && t[i] <= 2 * Tacc + T1 + T3 + Tdec)
- a[i] = -J2*(t[i] - 2 * Tacc - T1 - T3);
- if (2 * Tacc + T1 + T3 + Tdec<t[i] && t[i] <= 2 * Tacc + T1 + T2 + Tdec + T3)
- a[i] = -Dec;
- if (2 * Tacc + T1 + T2 + Tdec + T3<t[i])
- a[i] = -Dec + J2*(t[i] - (2 * Tacc + T1 + T2 + Tdec + T3));
- printf("%f__", a[i]);
- }
- printf("速度变化\n");
- float v[10000];
- for (int i = 0; i <= size; i++)
- {
- float ss = 0;
- for (int j = 0; j <= i; j++)
- {
- ss = ss + a[j] * step;
- }
- v[i] = ss;
- printf("%f__", v[i]);
- }
- float d[10000];
- printf("位移变化\n");
- for (int i = 0; i <= size; i++)
- {
- float ss = 0;
- for (int j = 0; j <= i; j++)
- {
- ss = ss + v[j] * step;
- }
- d[i] = ss;
- printf("%f__", d[i]);
- }
- return 0;
- }
- float critical(float Va,float Acca,float Deca,float Tacc,float Tdec,float S )
- {
- float T1;
- float T2;
- if (Va > Tacc*Acca&&Tacc*Acca > Tdec*Deca)
- {
- float J1 = Acca /Tacc ;
- float J2 = Deca /Tdec ;
- T1 = (Va - Acca*Tacc) / Acca;
- T2 = (Va - Deca*Tdec) / Deca;
- float C1 = Va*Tacc + Va*T1 / 2 + Va*Tdec + Va*T2 / 2;
- cout << C1 << endl;
- T2 = (Acca*Tacc - Deca*Tdec) / Deca;
- float C2 = Acca*Tacc*Tdec + Acca*Tacc*T2 / 2 + Acca*Tacc*Tacc;
- cout << C2 << endl;
- J2= Deca /Tdec;
- Tacc = Tdec*pow(J2 / J1, 0.5);
- float C3 = J1*pow(Deca*Tdec / J1, 1.5) + Deca*Tdec*Tdec;
- cout << C3 << endl;
- if(S>C1)
- return 1;
- if (S <= C1&&C2 < S)
- return 2;
- if (S <= C2&&S > C3)
- return 3;
- if (S <= C3)
- return 4;
- }
- if (Tacc*Acca >= Va&&Va > Tdec*Deca)
- {
- float J1= Acca/Tacc ;
- T2 = (Va - Deca*Tdec)/Deca;
- float C4 = pow(Va, 1.5) / pow(J1, 0.5) + Va*Tdec + Va*T2 / 2;
- cout << C4 << endl;
- J1=Acca/Tacc;
- float J2 = pow(Tacc / Tdec, 2)*J1;
- float C5 = Deca*Tdec*pow(Deca*Tdec / J1, 0.5)+Deca*Tdec*Tdec;
- cout << C5 << endl;
- if (S>C4)
- return 5;
- if (S <= C4&&C5 < S)
- return 6;
- if (S <= C5)
- return 7;
- }
- if (Tacc*Acca >Tdec*Deca&&Tdec*Deca >=Va)
- {
- float J1 = Acca / Tacc;
- float J2 = Deca / Tdec;
- float C6 = pow(Va, 1.5)*(pow(J1, -0.5) + pow(J2, -0.5));
- cout << C6 << endl;
- if(S>C6)
- return 8;
- if (S <= C6)
- return 9;
- }
- if (Tacc*Acca<=Tdec*Deca)
- {
- cout <<"需要逆向规划" << endl;
- return 10;
- }
- }
- int main()//逆向规划的时候把a[0]和a[T/step]交换
- {
- //motioncase1();
- //motioncase1();
- float Va = 3;//3和2是出现第二和第三大类的边界
- float Acca = 4;
- float Deca = 2;
- float Tacc = 1;
- float Tdec = 1;
- float S =5;
- float step = 0.01;
- int flag = critical(Va, Acca, Deca, Tacc, Tdec, S);
- cout<<flag<<endl;
- switch (flag)
- {
- case 1:motioncase1(Va, Acca, Deca, Tacc, Tdec, S, step);break;
- case 2:motioncase2(Va, Acca, Deca, Tacc, Tdec, S, step); break;
- case 3:motioncase3(Va, Acca, Deca, Tacc, Tdec, S, step); break;
- case 4:motioncase4(Va, Acca, Deca, Tacc, Tdec, S, step); break;
- case 5:motioncase5(Va, Acca, Deca, Tacc, Tdec, S, step); break;
- case 6:motioncase6(Va, Acca, Deca, Tacc, Tdec, S, step); break;
- case 7:motioncase7(Va, Acca, Deca, Tacc, Tdec, S, step); break;
- case 8:motioncase8(Va, Acca, Deca, Tacc, Tdec, S, step); break;
- case 9:motioncase9(Va, Acca, Deca, Tacc, Tdec, S, step); break;
- case 10:; break;
- default:;break;
- }
- return 0;
- }
Add Comment
Please, Sign In to add comment