迭代法

解线性方程组迭代法之Jacobi迭代法及其算法实现

两盒软妹~` 提交于 2020-03-07 20:33:35
在上一篇博客里面,笔者介绍了解线性方程组的LU分解法,这篇来介绍一个新的方法,迭代法.解线性方程组的迭代法有多种,其中就有Jacobi迭代法,它的原理是什么呢?有如下的线性方程组Ax=b,可将其变形为=>Mx=Nx+b=>x=M -1 Nx+M -1 b,设B=M -1 N=M -1 (M-A)=E-M -1 A,f=M -1 b,即可得到迭代式:X (k+1) =Bx (k) +f,这里我们只需要设置一个初始的x向量,依次将前一步的x k 代入到迭代式中,就可以得到x (k+1) 的结果 关于迭代法的两个注意事项: 1.迭代法相比于其他方法在计算大型稀疏矩阵矩阵方面,是有优势的,但不意味着只能解大型稀疏矩阵 2.并非所有的线性方程组都可以用迭代法进行求解,这是因为不是所有的迭代方程都是收敛的,可能会出现的情况就是,在迭代的过程中,会出现迭代解偏离精确解的情况,并且随着迭代的次数增多,会越偏越大 3.遇到不收敛的情况,就不能用迭代法求解,可以选用前面的Guass消元法或者LU分解法 接下来看代码实现~ 老规矩,初始化 double * * init_Matrix ( int r , int c ) { double * * p = new double * [ r ] ; int d = c + 1 ; for ( int i = 0 ; i < r ; i ++ ) { p [

1、算法初识

痴心易碎 提交于 2020-03-05 12:42:10
1.什么是 算法 ? 算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。 也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出。 如果一个算法有缺陷,或不适合于某个问题,执行这个算法将不会解决这个问题。 不同的算法可能用不同的时间、空间或效率来完成同样的任务。 一个算法的优劣可以用空间复杂度与时间复杂度来衡量。 算法中的指令描述的是一个计算,当其运行时能从一个初始状态和(可能为空的)初始输入开始,经过一系列有限而清晰定义的状态,最终产生输出并停止于一个终态。 一个状态到另一个状态的转移不一定是确定的。随机化算法在内的一些算法,包含了一些随机输入。 1.1特征 一个算法应该具有以下五个重要的特征: 有穷性 (Finiteness) 算法的有穷性是指算法必须能在执行有限个步骤之后终止; 确切性 (Definiteness) 算法的每一步骤必须有确切的定义; 输入项 (Input) 一个算法有0个或多个输入,以刻画运算对象的初始情况,所谓0个输入是指算法本身定出了初始条件; 输出项 (Output) 一个算法有一个或多个输出,以反映对输入数据加工后的结果。没有输出的算法是毫无意义的; 可行性 (Effectiveness) 算法中执行的任何计算步骤都是可以被分解为基本的可执行的操作步

迭代法求解递推方程,

拟墨画扇 提交于 2020-02-29 11:10:36
步骤 1,不断用递推方程的又不的替换左部 2,每次替换,随着n的降低在和式中多出一项 3,知道出现处置停止替代 4 ,将处置带入并对和式求和 **5,可用数学归纳法验证解的正确性 ** 汉诺塔方程 插入排序方程 换元迭代 将对n的递推式换成对其他变元K的递推式,对k递推 例:二分归并算法 来源: CSDN 作者: .........阳光小可爱 链接: https://blog.csdn.net/weixin_43342105/article/details/104569876

74_迭代法求平方根

旧时模样 提交于 2020-02-17 15:18:27
#include<iostream> #include<stdio.h> #include<math.h> using namespace std; int main(){ double a[100]={0}; double x; cin>>x; a[0]=x; int i=1; while((a[i]-a[i-1])<0.00001){ a[i]=0.5*(a[i-1]+x/a[i-1]); i++; } printf("%.3lf",a[i-1]); } 来源: CSDN 作者: 徐文小涛涛 链接: https://blog.csdn.net/qq_41440031/article/details/104356971

1.算法设计的基本方法(二)

自古美人都是妖i 提交于 2020-02-13 02:09:06
续上一篇继续写算法设计的基本方法,递推法和递归法 3.递推法 其基本思想就是从前面的一些量推出后面的一些量,它从已知的初始条件出发,逐次推出所要求解的各中间结果和最终结果。 具体实现有两种方式: 递归的和非递归的 递归的递推求解是使用迭代法计算,自顶向下进行; 非递归的地推求解是使用迭代法计算,自底向上。 [例1-16]计算斐波那契数。斐波那契数列存在着如下递推关系: f(0)=0,f(1)=1,f(n)=f(n-1)+f(n-2),n≥2 ; 程序如下: int Fib ( int k ) { if ( k < 2 ) return k ; int f0 , f1 , i , fk ; f0 = 0 , f1 = 1 ; for ( int i = 2 ; i <= k ; i ++ ) { fk = f0 + f1 ; f0 = f1 ; f1 = fk ; } return fk ; } 4.递归法 如果一个数据对象包含它自身,则称此对象为递归的; 如果一个过程直接或间接调用它自身,则该过程是递归的。 直接调用自身称作直接递归,间接调用就称间接递归呗! 递归是构造算法的一种基本方法,它将一个复杂问题归结为若干个较为简单的问题,然后将这些较为简单问题进一步归结为更简单的问题,这个过程一直进行下去,直到归结为最简单的问题为止,这个最简单的问题即为递归终止条件,也称作 递归出口 。

PTA 7-10 迭代法求正数的平方根 (10分)

感情迁移 提交于 2020-01-07 22:56:44
利用迭代法求正数的平方根。x0=a/2; 输入格式: 要求,在一行输入实数a(a>0)和eps(eps>0)。 输出格式: 输出平方根,保留4位小数及迭代次数。 输入样例: 在这里给出一组输入。例如: 7.8 0.01 输出样例: 在这里给出相应的输出。例如: 2.7949 3 作者: 李志聪 单位: 哈尔滨师范大学 时间限制: 400 ms 内存限制: 64 MB 代码长度限制: 16 KB 1 import java.util.Scanner; 2 public class Main { 3 public static void main(String[] args) { 4 Scanner sc=new Scanner(System.in); 5 double a=sc.nextDouble(); 6 double eps=sc.nextDouble(); 7 int sum=1; 8 double temp=a/2,item; 9 item=0.5*temp+0.5*(a/temp); 10 while(Math.abs(item-temp)>=eps) { 11 temp=item; 12 item=0.5*temp+0.5*(a/temp); 13 sum++; 14 } 15 double k; 16 k=item*0.5+temp*0.5; 17 System

最小二乘法推导

◇◆丶佛笑我妖孽 提交于 2020-01-01 04:49:25
原文出处 : https://blog.csdn.net/u011026329/article/details/79183114 最小二乘法 1、什么是最小二乘思想? ​ 简单地说,最小二乘的思想就是要使得 观测点和估计点的距离的平方和达到最小 .这里的“二乘”指的是用平方来度量观测点与估计点的远近(在古汉语中“平方”称为“二乘”),“最小”指的是参数的估计值要保证各个观测点与估计点的距离的平方和达到最小。从这个上也可以看出,最小二乘也可用于拟合数据模型。 2. 最小二乘法推导 ​ 我们以最简单的一元线性模型来解释最小二乘法。什么是一元线性模型呢? 监督学习中,如果预测的变量是离散的,我们称其为分类(如决策树,支持向量机等),如果预测的变量是连续的,我们称其为回归。回归分析中,如果只包括一个自变量和一个因变量,且二者的关系可用一条直线近似表示,这种回归分析称为一元线性回归分析。如果回归分析中包括两个或两个以上的自变量,且因变量和自变量之间是线性关系,则称为多元线性回归分析。对于二维空间线性是一条直线;对于三维空间线性是一个平面,对于多维空间线性是一个超平面… ​ 对于一元线性回归模型, 假设从总体中获取了 n n 个点,可以使用无数条曲线来拟合。要求样本回归函数尽可能好地拟合这组值。综合起来看,这条直线处于样本数据的中心位置最合理。 ​ 选择最佳拟合曲线的标准可以确定为

雅克比迭代法

与世无争的帅哥 提交于 2019-12-22 16:44:18
# include <iostream> # include "math.h" using namespace std ; //n为方程的阶数 # define n 6 //方程组的系数矩阵、常数项向量、初值向量 double a [ 6 ] [ 6 ] = { { 4 , - 1 , 0 , - 1 , 0 , 0 } , { - 1 , 4 , - 1 , 0 , - 1 , 0 } , { 0 , - 1 , 4 , - 1 , 0 , - 1 } , { - 1 , 0 , - 1 , 4 , - 1 , 0 } , { 0 , - 1 , 0 , - 1 , 4 , - 1 } , { 0 , 0 , - 1 , 0 , - 1 , 4 } } , b [ n ] = { 0 , 5 , - 2 , 5 , - 2 , 6 } , x [ n ] = { 0 , 5 , - 2 , 5 , - 2 , 6 } , c [ n ] ; //counter为最大迭代次数 int i = 0 , j , k = 0 , counter = 100 ; int main ( ) { int k = 0 , i = 0 ; double num1 , E ; float y [ n ] ; do { E = 0 ; for ( j = 0 ; j < n ; j ++ ) c [

python实现迭代法求方程组的根

核能气质少年 提交于 2019-12-05 07:42:22
有方程组如下: 迭代法求解x,python代码如下: import numpy as np import matplotlib.pyplot as plt A = np.array([[8, -3, 2], [4, 11, -1], [6, 3, 12]]) b = np.array([[20, 33, 36]]) # 方法一:消元法求解方程组的解 result = np.linalg.solve(A, b.T) print('Result:\n', result) # 方法二:迭代法求解方程组的解 B = np.array([[0, 3/8, -2/8], [-4/11, 0, 1/11], [-6/12, -3/12, 0]]) f = np.array([[20/8, 33/11, 36/12]]) error = 1.0e-6 steps = 100 xk = np.zeros((3, 1)) # initialize parameter setting errorlist = [] for k in range(steps): xk_1 = xk xk = np.matmul(B, xk) + f.T print('xk:\n', xk) errorlist.append(np.linalg.norm(xk-xk_1)) if errorlist[-1] < error:

MATLAB之Jacobi迭代法

安稳与你 提交于 2019-12-02 06:26:19
function x=Jacobi(a,b,n,N,t) x=zeros(n,1); y=zeros(n,1); for i=1:n if(a(i,i)==0) error('算法失败'); end end for k=1:N+1 d=0; for i=1:n sum=0; for j=1:n if(i~=j) sum=sum+a(i,j)*x(j); end end y(i)=(b(i)-sum)/a(i,i); d(i)=abs(y(i)-x(i)); if(d(i)>d) d=d(i); end end if(d<t) for p=1:n fprintf('%d',y(p)); end break; end if(k==N) fprintf('迭代失败'); break; end for i=1:n x(i)=y(i); end end end a=[10,-1,2,0;-1,11,-1,3;2,-1,10,-1;0,3,-1,8] b=[6;25;-11;15] n=4 N=100 t=0.001 来源: https://blog.csdn.net/qq_43558971/article/details/102730153