C#编程解方程组之Jacobi法实例
小标 2018-08-13 来源 : 阅读 1076 评论 0

摘要:本文主要向大家介绍了C#编程解方程组之Jacobi法实例,通过具体的内容向大家展示,希望对大家学习C#编程有所帮助。

本文主要向大家介绍了C#编程解方程组之Jacobi法实例,通过具体的内容向大家展示,希望对大家学习C#编程有所帮助。

解方程组之Jacobi法

迭代过程首先将方程组中的系数矩阵A分解成三部分,即:A = L+D+U,如图1所示,其中D为对角阵,L为下三角矩阵,U为上三角矩阵。之后确定迭代格式,X^(k+1) = B*X^(k) +f ,(这里^表示的是上标,括号内数字即迭代次数),如图2所示,其中B称为迭代矩阵,雅克比迭代法中一般记为J。(k = 0,1,......)再选取初始迭代向量X^(0),开始逐次迭代。核心部分,迭代实现:

   

public void Calcu5() 

        { 

            int count1 = 0, count2 = 0; 

            while(true) 

            { 

                for(int i=0;i<n;i++) 

                { 

                    double sum = 0; 

                    for(int j=0;j<n;j++) 

                    { 

                        if(j!=i) 

                        { 

                            sum += a[i, j] * x[j]; 

                        } 

                    } 

                    x2[i] = (a[i, n] - sum) / a[i, i]; 

                    if (Math.Abs(x2[i] - x[i]) < e) 

                        count2++; 

                } 

                count1++; 

                if(count1>10000) 

                { Console.WriteLine("迭代发散!!!");break; } 

                if(count2==n) 

                { Console.WriteLine("迭代次数:{0}", count2);break; } 

                for(int i=0;i<n;i++) 

                { x[i] = x2[i]; } 

            } 

        }

   


using System; 

using System.Collections.Generic; 

using System.Linq; 

using System.Text; 

using System.Threading.Tasks; 

   

namespace Jacobi迭代 

    class Jacobi 

    { 

        int n; 

        public int N 

        { 

            get { return n; } 

            set { n = value; } 

        } 

        double[,] a; 

        public double[,] A 

        { 

            get { return a; } 

            set { a = value; } 

        } 

        double[] x; 

        public double[] X 

        { 

            get { return x; } 

            set { x = value; } 

        } 

        double e = 0.00001; 

        public double E 

        { 

            get { return e; } 

            set { e = value; } 

        } 

        private double[] x2; 

        public double[] X2 

        { 

            get { return x2; } 

            set { x2 = value; } 

        } 

        public void Input() 

        { 

            Console.WriteLine("请输入阶数:"); 

            n = Convert.ToInt32(Console.ReadLine()); 

            a = new double[n, n + 1]; 

            x = new double[n]; 

            x2 = new double[N + 1]; 

            for (int i = 0; i < N; i++) 

            { 

                X[i] = 0; 

            } 

            Console.WriteLine("请输入各行系数(','或' '隔开):"); 

            for (int i = 0; i < n; i++) 

            { 

                string s = Console.ReadLine(); 

                string[] ss = s.Split(' ', ','); 

                for (int j = 0; j < n + 1; j++) 

                { 

                    a[i, j] = Convert.ToDouble(ss[j]); 

                } 

            } 

        } 

        public void Calcu5() 

        { 

            int count1 = 0, count2 = 0; 

            while(true) 

            { 

                for(int i=0;i<n;i++) 

                { 

                    double sum = 0; 

                    for(int j=0;j<n;j++) 

                    { 

                        if(j!=i) 

                        { 

                            sum += a[i, j] * x[j]; 

                        } 

                    } 

                    x2[i] = (a[i, n] - sum) / a[i, i]; 

                    if (Math.Abs(x2[i] - x[i]) < e) 

                        count2++; 

                } 

                count1++; 

                if(count1>10000) 

                { Console.WriteLine("迭代发散!!!");break; } 

                if(count2==n) 

                { Console.WriteLine("迭代次数:{0}", count2);break; } 

                for(int i=0;i<n;i++) 

                { x[i] = x2[i]; } 

            } 

        } 

        public void Output() 

        { 

            Console.WriteLine("方程系数为:"); 

            for (int i = 0; i < n; i++) 

            { 

                string s = null; 

                for (int j = 0; j < n + 1; j++) 

                { 

                    s += string.Format("{0,8:f2}", a[i, j]); 

                } 

                Console.WriteLine(s); 

            } 

        } 

   

        public void OutputX() 

        { 

            Console.WriteLine("\n方程组的解是:"); 

            for (int i = 0; i < n; i++) 

            { 

                Console.WriteLine("x{0}={1}", i + 1, x[i]); 

            } 

        } 

    } 

    class Program 

    { 

        static void Main(string[] args) 

        { 

            Jacobi abc = new Jacobi(); 

            abc.Input(); 

            abc.Output(); 

            abc.Calcu5(); 

            abc.OutputX(); 

        } 

    } 

}

    

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标编程语言C#.NET频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程