一维数学方程式组求解。

来源:互联网 发布:永辉超市 知乎 编辑:程序博客网 时间: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;            }        }    }


原创粉丝点击