一维数学方程式组求解。
来源:互联网 发布:永辉超市 知乎 编辑:程序博客网 时间:2024/05/19 16:33
通过消元法得到新的低阶方程组,递归求解新方程组,最后求解所消去变元。
class Program { static void Main(string[] args) { List<decimal[]> list = new List<decimal[]>(); decimal[] equation = new decimal[] { 0, 1, 1, 0 }; list.Add(equation); decimal[] equation1 = new decimal[] { 1, 2, 1, 3 }; list.Add(equation1); decimal[] equation2 = new decimal[] { 1, 1, 2, 1 }; list.Add(equation2); decimal[] resultList = FunctionCalc.CalcTest(list); } } class FunctionCalc { /// <summary> /// 输入为数学方程组,每个List[i]相当于一个数学方程,对于 aX + bY + cZ = K1; List[i] = {a, b, c, K1} /// 返回为结果数组,对上面的方程组返回 {X, Y, Z} 数组。 /// </summary> /// <param name="list"></param> /// <returns></returns> public static decimal[] CalcTest(List<decimal[]> list) { decimal[] resultList = null; if (list.Count > 0) { int parameters = list[0].Length - 1; if (parameters != list.Count) { throw new ArgumentException("Invalid Argument!"); } resultList = new decimal[parameters]; SetFirstNotZero(list); if (parameters == 1) { resultList[0] = list[0][1] / list[0][0]; } else { List<decimal[]> subList = new List<decimal[]>(); decimal[] firstEquation = (decimal[])list[0].Clone(); int subParameters = firstEquation.Length - 1; for (int j = 1; j < list.Count; j++) { decimal[] subEquation; if (list[j][0] == 0) { subEquation = CreateSubEqualation(list[j]); } else { decimal[] temp1 = (decimal[])list[0].Clone(); decimal[] temp2 = (decimal[])list[j].Clone(); subEquation = CreateSubEqualation(temp1, temp2); } subList.Add(subEquation); } SetFirstNotZero(subList); decimal[] subResult = CalcTest(subList); for (int i = 1; i < resultList.Length; i++) { resultList[i] = subResult[i - 1]; } decimal temp = firstEquation[firstEquation.Length - 1]; for (int i = 1; i < resultList.Length; i++) { temp = temp - firstEquation[i] * resultList[i]; } resultList[0] = temp / firstEquation[0]; } } return resultList; } /// <summary> /// 调用此方法,保证方程式组 list 的第一个方程 list[0] 的第一个变元的系数(list[0][0])不为 0 /// </summary> /// <param name="list"></param> public static void SetFirstNotZero(List<decimal[]> list) { bool flag = false; for (int i = 0; i < list.Count; i++) { if (list[i][0] != 0) { flag = true; if (i != 0) { decimal[] temp = list[0]; list[0] = list[i]; list[i] = temp; } } } if (!flag) { throw new ArgumentException("Invalid Equation List!"); } } /// <summary> /// 根据2个方程,创建消去第一变元后的新方程。 /// </summary> /// <param name="topEqualation1"></param> /// <param name="topEqualation2"></param> /// <returns></returns> public static decimal[] CreateSubEqualation(decimal[] topEqualation1, decimal[] topEqualation2) { decimal[] subEqualation = new decimal[topEqualation1.Length - 1]; decimal multi1 = topEqualation2[0]; decimal multi2 = topEqualation1[0]; MultipleEqualation(topEqualation1, multi1); MultipleEqualation(topEqualation2, multi2); for (int i = 0; i < subEqualation.Length; i++) { subEqualation[i] = topEqualation1[i + 1] - topEqualation2[i + 1]; } return subEqualation; } /// <summary> /// 方程第一变元系数为0,直接得到消去第一变元的新方程 /// </summary> /// <param name="topEqualation"></param> /// <returns></returns> public static decimal[] CreateSubEqualation(decimal[] topEqualation) { decimal[] subEqualation = new decimal[topEqualation.Length - 1]; for (int i = 0; i < subEqualation.Length; i++) { subEqualation[i] = topEqualation[i + 1]; } return subEqualation; } /// <summary> /// 倍乘方程 /// </summary> /// <param name="equalation"></param> /// <param name="mulpi"></param> public static void MultipleEqualation(decimal[] equalation, decimal mulpi) { for (int i = 0; i < equalation.Length; i++) { equalation[i] = equalation[i] * mulpi; } } }
- 一维数学方程式组求解。
- 采用数学方法,巧妙运用循环,求解X的三次方的值
- 幻方求解
- 一元三次方求解
- 幻方问题求解
- 求解法兰西数学奇迹
- 数学建模求解
- Matlab求解数学问题
- C++第13周报告(一)用函数完成分段数学函数的求解
- 数学建模专栏 | 第十篇:MATLAB CUMCM真题求解实例一:数据型
- C语言 -- 数学问题求解
- 数学求解之截取字符串
- 数学求解之金额转换
- 数学求解之遗传算法
- 数学一
- 求解三角形(一)
- 求解线性方程组(一)
- 求解行列式(一)
- nutch单元测试出现问题。
- Web项目中关闭线程
- use expect to input password automatically
- android px 转换成 dip 做代码适配
- WinCE虚拟串口驱动(一) .
- 一维数学方程式组求解。
- android多国语言使用
- Valid a Palindrome
- linux设备驱动--异步通知和异步I/O
- mysql 字符集校验 general unicode utf8_bin_ci
- 在oracle 查看执行计划及如何看懂执行计划.
- Windows ce 桌面定制小结
- redis-cli 常用命令
- Linux下SSH免密码登录