|
| 1 | +namespace Common.BasicHelper.Math; |
| 2 | + |
| 3 | +public class Equation |
| 4 | +{ |
| 5 | + /// <summary> |
| 6 | + /// 解方程 - 二元一次 |
| 7 | + /// </summary> |
| 8 | + /// <param name="a1">方程一的系数 a</param> |
| 9 | + /// <param name="b1">方程一的系数 b</param> |
| 10 | + /// <param name="c1">方程一的结果 c</param> |
| 11 | + /// <param name="a2">方程二的系数 a</param> |
| 12 | + /// <param name="b2">方程二的系数 b</param> |
| 13 | + /// <param name="c2">方程二的系数 c</param> |
| 14 | + /// <returns>结果 - x,y - 组成的数组</returns> |
| 15 | + public static double[] SolveEquation( |
| 16 | + double a1, double b1, double c1, |
| 17 | + double a2, double b2, double c2) |
| 18 | + { |
| 19 | + var rst = new double[2]; |
| 20 | + rst[1] = (c2 - (a2 * c1 / a1)) / (b2 - (a2 * b1 / a1)); |
| 21 | + rst[0] = (c1 - (b1 * rst[1])) / a1; |
| 22 | + return rst; |
| 23 | + } |
| 24 | + |
| 25 | + /// <summary> |
| 26 | + /// 解方程 - 三元一次 |
| 27 | + /// </summary> |
| 28 | + /// <param name="a1">方程一的系数 a</param> |
| 29 | + /// <param name="b1">方程一的系数 b</param> |
| 30 | + /// <param name="c1">方程一的系数 c</param> |
| 31 | + /// <param name="d1">方程一的结果 d</param> |
| 32 | + /// <param name="a2">方程二的系数 a</param> |
| 33 | + /// <param name="b2">方程二的系数 b</param> |
| 34 | + /// <param name="c2">方程二的系数 c</param> |
| 35 | + /// <param name="d2">方程二的结果 d</param> |
| 36 | + /// <returns>结果 - x,y - 组成的数组</returns> |
| 37 | + public static double[] SolveEquation( |
| 38 | + double a1, double b1, double c1, double d1, |
| 39 | + double a2, double b2, double c2, double d2, |
| 40 | + double a3, double b3, double c3, double d3 |
| 41 | + ) |
| 42 | + { |
| 43 | + var rst = new double[3]; |
| 44 | + double na1, nb1, nc1, na2, nb2, nc2, x, y, z; |
| 45 | + |
| 46 | + na1 = a1 * b2 - a2 * b1; nb1 = a1 * c2 - a2 * c1; nc1 = a1 * d2 - a2 * d1; |
| 47 | + |
| 48 | + na2 = a1 * b3 - a3 * b1; nb2 = a1 * c3 - a3 * c1; nc2 = a1 * d3 - a3 * d1; |
| 49 | + |
| 50 | + var y_z = SolveEquation(na1, nb1, nc1, na2, nb2, nc2); |
| 51 | + y = y_z[0]; z = y_z[1]; |
| 52 | + x = (d1 - b1 * y - c1 * z) / a1; |
| 53 | + rst[0] = x; rst[1] = y; rst[2] = z; |
| 54 | + return rst; |
| 55 | + } |
| 56 | + |
| 57 | + /* a1x+b1y+c1z+d1m=e1 |
| 58 | + * a2x+b2y+c2z+d2m=e2 |
| 59 | + * a3x+b3y+c3z+d3m=e3 |
| 60 | + * a4x+b4y+c4z+d4m=e4 |
| 61 | + * |
| 62 | + * a1x=e1-b1y-c1z-d1m |
| 63 | + * x=(e1-b1y-c1z-d1m)/a1 |
| 64 | + * |
| 65 | + * a2(e1-b1y-c1z-d1m)/a1+b2y+c2z+d2m=e2 |
| 66 | + * a3(e1-b1y-c1z-d1m)/a1+b3y+c3z+d3m=e3 |
| 67 | + * a4(e1-b1y-c1z-d1m)/a1+b4y+c4z+d4m=e4 |
| 68 | + * |
| 69 | + * (a1*b2-a2*b1)y+(a1*c2-a2*c1)z+(a1*d2-a2*d1)m=a1*e2-a2*e1 |
| 70 | + * (a1*b3-a3*b1)y+(a1*c3-a3*c1)z+(a1*d3-a3*d1)m=a1*e3-a3*e1 |
| 71 | + * (a1*b4-a4*b1)y+(a1*c4-a4*c1)z+(a1*d4-a4*d1)m=a1*e4-a4*e1 |
| 72 | + */ |
| 73 | + |
| 74 | + /// <summary> |
| 75 | + /// 解方程组 - 四元一次 |
| 76 | + /// </summary> |
| 77 | + /// <param name="a1">方程一的系数 a</param> |
| 78 | + /// <param name="b1">方程一的系数 b</param> |
| 79 | + /// <param name="c1">方程一的系数 c</param> |
| 80 | + /// <param name="d1">方程一的系数 d</param> |
| 81 | + /// <param name="e1">方程一的结果 e</param> |
| 82 | + /// <param name="a2">方程二的系数 a</param> |
| 83 | + /// <param name="b2">方程二的系数 b</param> |
| 84 | + /// <param name="c2">方程二的系数 c</param> |
| 85 | + /// <param name="d2">方程二的系数 d</param> |
| 86 | + /// <param name="e2">方程二的结果 e</param> |
| 87 | + /// <param name="a3">方程三的系数 a</param> |
| 88 | + /// <param name="b3">方程三的系数 b</param> |
| 89 | + /// <param name="c3">方程三的系数 c</param> |
| 90 | + /// <param name="d3">方程三的系数 d</param> |
| 91 | + /// <param name="e3">方程三的结果 e</param> |
| 92 | + /// <param name="a4">方程四的系数 a</param> |
| 93 | + /// <param name="b4">方程四的系数 b</param> |
| 94 | + /// <param name="c4">方程四的系数 c</param> |
| 95 | + /// <param name="d4">方程四的系数 d</param> |
| 96 | + /// <param name="e4">方程四的结果 e</param> |
| 97 | + /// <returns>x_y_z_t 的数组,对应角标分别为 0,1,2,3</returns> |
| 98 | + public static double[] SolveEquation( |
| 99 | + double a1, double b1, double c1, double d1, double e1, |
| 100 | + double a2, double b2, double c2, double d2, double e2, |
| 101 | + double a3, double b3, double c3, double d3, double e3, |
| 102 | + double a4, double b4, double c4, double d4, double e4 |
| 103 | + ) |
| 104 | + { |
| 105 | + var rst = new double[4]; |
| 106 | + double na1, nb1, nc1, nd1, na2, nb2, nc2, nd2, na3, nb3, nc3, nd3, x, y, z, m; |
| 107 | + na1 = a1 * b2 - a2 * b1; nb1 = a1 * c2 - a2 * c1; |
| 108 | + nc1 = a1 * d2 - a2 * d1; nd1 = a1 * e2 - a2 * e1; |
| 109 | + na2 = a1 * b3 - a3 * b1; nb2 = a1 * c3 - a3 * c1; |
| 110 | + nc2 = a1 * d3 - a3 * d1; nd2 = a1 * e3 - a3 * e1; |
| 111 | + na3 = a1 * b4 - a4 * b1; nb3 = a1 * c4 - a4 * c1; |
| 112 | + nc3 = a1 * d4 - a4 * d1; nd3 = a1 * e4 - a4 * e1; |
| 113 | + var y_z_m = SolveEquation( |
| 114 | + na1, nb1, nc1, nd1, |
| 115 | + na2, nb2, nc2, nd2, |
| 116 | + na3, nb3, nc3, nd3); |
| 117 | + y = y_z_m[0]; z = y_z_m[1]; m = y_z_m[2]; |
| 118 | + x = (e1 - b1 * y - c1 * z - d1 * m) / a1; |
| 119 | + rst[0] = x; rst[1] = y; rst[2] = z; rst[3] = m; |
| 120 | + return rst; |
| 121 | + } |
| 122 | +} |
0 commit comments