用C#求解数学方程

xiaolong_118 2013-02-20 04:48:57
2x+y+z=0
x+2y+Z=3
x+Y+2z=1
根据以上线性方程组求出x,y,z的值。(用C#实现)
我去图书馆找了些C#的书,但是没有这方面的例子,这个问题困扰我两天了。求助各位大虾们帮忙,请给出具体代码哈。
...全文
555 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
skevil 2013-02-21
  • 打赏
  • 举报
回复
学习了!!都快忘记线性代数这些了
catchdream 2013-02-21
  • 打赏
  • 举报
回复
上个版本有点小bug,最新版本参考我的blog: http://blog.csdn.net/catchdream/article/details/8597808
  • 打赏
  • 举报
回复
最简单的办法是,你在MATLAB里面用函数来实现,然后用C#去调用MATLAB,其实说白了,这是个算法问题,算法懂了,写程序很简单
CandPointer 2013-02-21
  • 打赏
  • 举报
回复
面向对象,模板,多态,异常,Linq 杀鸡何须宰牛刀? 要用最经济的方法. LZ的三元一次方程,又是课后作业 ,直接用 解析解的表达式就行了. 就像,打算盘,不需要 一板一眼地,从 1累加到100,用公式就行了
CandPointer 2013-02-21
  • 打赏
  • 举报
回复
五块钱以内一次的,有解析解 a1*x + b1*y + c1*z = d1 a2*x + b2*y + c2*z = d2 a3*x + b3*y + c3*z = d3 **************** 对于上述方程, 直接 用下面的表达式(表达式,硬编码到程序里),可求出 , X, Y, Z 什么循环的都不要了. x = (b1*c2*d3 - b1*c3*d2 - b2*c1*d3 + b2*c3*d1 + b3*c1*d2 - b3*c2*d1)/(a1*b2*c3 - a1*b3*c2 - a2*b1*c3 + a2*b3*c1 + a3*b1*c2 - a3*b2*c1) y = -(a1*c2*d3 - a1*c3*d2 - a2*c1*d3 + a2*c3*d1 + a3*c1*d2 - a3*c2*d1)/(a1*b2*c3 - a1*b3*c2 - a2*b1*c3 + a2*b3*c1 + a3*b1*c2 - a3*b2*c1) z = (a1*b2*d3 - a1*b3*d2 - a2*b1*d3 + a2*b3*d1 + a3*b1*d2 - a3*b2*d1)/(a1*b2*c3 - a1*b3*c2 - a2*b1*c3 + a2*b3*c1 + a3*b1*c2 - a3*b2*c1)
devmiao 2013-02-20
  • 打赏
  • 举报
回复
在图书馆找《线性代数》书,每一本都有。大学一年级就会学到。
devmiao 2013-02-20
  • 打赏
  • 举报
回复
如果变元很少,可以用行列式消去。
nikolay 2013-02-20
  • 打赏
  • 举报
回复
引用 1 楼 catchdream 的回复:
C# code?12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394……
惭愧....都不记得怎么解方程式了
  • 打赏
  • 举报
回复
看起来好高端的样子,楼主解决了,记得给分,过来看答案
  • 打赏
  • 举报
回复
别把思维太局限在方程上,这完全是矩阵的基本知识,用线性代数里的高斯消去法即可,你最好去理解下这个方法,剩下的就是翻译的工作了。
catchdream 2013-02-20
  • 打赏
  • 举报
回复

    class Program
    {
        static void Main(string[] args)
        {           
            List<double[]> list = new List<double[]>();
            double[] equation = new double[] { 2, 1, 1, 0 };
            list.Add(equation);
            double[] equation1 = new double[] { 1, 2, 1, 3 };
            list.Add(equation1);
            double[] equation2 = new double[] { 1, 1, 2, 1 };
            list.Add(equation2);

            double[] resultList = FunctionCalc.CalcTest(list);            
        }
    }

    class FunctionCalc
    {
        /// <summary>
        /// 输入为不等式组,每个List[i]相当于一个不等式,对于 aX + bY + cZ = K1; List[i] = {a, b, c, K1}
        /// </summary>
        /// <param name="list"></param>
        /// <returns></returns>
        public static double[] CalcTest(List<double[]> list)
        {
            double[] resultList = null;
            if (list.Count > 0)
            {
                int parameters = list[0].Length - 1;
                if (parameters != list.Count)
                {
                    throw new ArgumentException("Invalid Argument!");
                }
                resultList = new double[parameters];
                if (parameters == 1)
                {
                    resultList[0] = list[0][1] / list[0][0];
                }
                else
                {
                    List<double[]> subList = new List<double[]>();
                    double[] firstEquation = (double[])list[0].Clone();
                    int subParameters = firstEquation.Length - 1;
                    for (int j = 1; j < list.Count; j++)
                    {
                        double[] subEquation;
                        if (list[j][0] == 0)
                        {
                            subEquation = CreateSubEqualation(list[j]);                            
                        }
                        else
                        {
                            double[] temp1 = (double[])list[0].Clone();
                            double[] temp2 = (double[])list[j].Clone();
                            subEquation = CreateSubEqualation(temp1, temp2);
                        }
                        subList.Add(subEquation);
                    }
                    SetFirstNotZero(subList);
                    double[] subResult = CalcTest(subList);
                    for (int i = 1; i < resultList.Length; i++)
                    {
                        resultList[i] = subResult[i - 1];
                    }
                    double 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;
        }

        public static void SetFirstNotZero(List<double[]> list)
        {
            bool flag = true;
            for (int i = 0; i < list.Count; i++)
            {
                if (list[i][0] != 0)
                {
                    flag = true;
                    if (i != 0)
                    {
                        double[] temp1 = list[0];
                        double[] temp2 = list[i];
                        ExchangeList(ref temp1, ref temp2);
                        list[0] = temp2;
                        list[i] = temp1;
                    }
                }
            }
            if (!flag)
            {
                throw new ArgumentException("Invalid Equation List!");
            }
        }

        public static double[] CreateSubEqualation(double[] topEqualation1, double[] topEqualation2)
        {
            double[] subEqualation = new double[topEqualation1.Length - 1];
            double multi1 = topEqualation2[0];
            double multi2 = topEqualation1[0];
            DoubleEqualation(topEqualation1, multi1);
            DoubleEqualation(topEqualation2, multi2);
            for (int i = 0; i < subEqualation.Length; i++)
            {
                subEqualation[i] = topEqualation1[i + 1] - topEqualation2[i + 1];
            }
            return subEqualation;
        }

        public static double[] CreateSubEqualation(double[] topEqualation)
        {
            double[] subEqualation = new double[topEqualation.Length - 1];
            for (int i = 0; i < subEqualation.Length; i++)
            {
                subEqualation[i] = topEqualation[i + 1];
            }
            return subEqualation;
        }

        public static void DoubleEqualation(double[] equalation, double mulpi)
        {
            for (int i = 0; i < equalation.Length; i++)
            {
                equalation[i] = equalation[i] * mulpi;
            }
        }

        public static void ExchangeList(ref double[] equalation1, ref double[] equalation2)
        {
            double[] temp = equalation1;
            equalation1 = equalation2;
            equalation2 = temp;
        }
    }
各种数据结构、算法及实用的C#源代码。C#,数值计算,求解微分方程的吉尔(Gear)四阶方法与源代码。1 微分方程 微分方程,是指含有未知函数及其导数的关系式。解微分方程就是找出未知函数。 微分方程是伴随着微积分学一起发展起来的。微积分学的奠基人Newton和Leibniz的著作中都处理过与微分方程有关的问题。微分方程的应用十分广泛,可以解决许多与导数有关的问题。物理中许多涉及变力的运动学、动力学问题,如空气的阻力为速度函数的落体运动等问题,很多可以用微分方程求解。此外,微分方程在化学、工程学、经济学和人口统计等领域都有应用。数学领域对微分方程的研究着重在几个不同的面向,但大多数都是关心微分方程的解。只有少数简单的微分方程可以求得解析解。不过即使没有找到其解析解,仍然可以确认其解的部分性质。在无法求得解析解时,可以利用数值分析的方式,利用电脑来找到其数值解。 动力系统理论强调对于微分方程系统的量化分析,而许多数值方法可以计算微分方程的数值解,且有一定的准确度。2 数值解法 作为数值分析的基础内容,常微分方程数值解法的研究已发展得相当成熟,理论上也颇为完善,各类有实用价值的算法已经

110,526

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧