雅克比算法
❶ 计算雅克比符号的算法和程序(我找到一个计算雅克比符号的程序可是看不懂,请高手帮帮忙!指点一下!)
ation(A,B,X0,kmax,tol);
% 雅可比(Jacobi)迭代法解线性方程组AX=B
if nargin == 4;
tol = 1*10^(-4); % 设置默认精度
elseif nargin ==3;
tol = 1*10^(-4);
kmax = 500;% 设置默认迭代次数
elseif nargin == 2;
1*10^(-4);
kmax = 500;
X0 = zeros(size(B)); % 设置默认初值
end
n = length(B); % 获得未知数个数
if size(X0,1)<size(X0,2); % 把默认初值改为列向量
X0 = X0';
end
DA = diag(A); %提取A的对角元素
Ap = [diag(DA)-A]./repmat(DA,1,n); % 生成式(7-28)中的矩阵Ap
Bp = B./DA; % 生成式(7-28)中的向量Bp
for k = 1:kmax
X = Ap*X0+Bp; % 雅可比(Jacobi)迭代公式
if norm(X-X0)/(norm(X0)+eps)<tol;% 达到精度将终止循环
break;
end
X0 = X;
end
X=X';
在MATLAB中输入:
A=[5,2,1;-1,4,2;2,-3,10;];
B=[-12,20,3]';
X = Jacobi_iteration(A,B)
运行有:
k =
15
X =
-3.9999 3.0002 1.9999
考虑到你是要给导师看的,就给你上面这个吧,其实可以给一个更简单的,就简单的迭代就行了,下面就是个简单的:不写注释了,相信你应该看得懂的,呵呵
clear all
a=[5,2,1;-1,4,2;2,-3,10;];
b=[-12,20,3];
b=b';
[m,n]=size(a);
x=[0 0 0];
e1=1*10^(-4);
for c=1:100
y=x;
for i=1:n
t1=0;
for j=1:n
t1=t1+a(i,j)*y(j);
end
x(i)=x(i)+(b(i)-t1)/(a(i,i))
end
if abs(y-x)<e1
index=c;
break;
end
end
index
x
❷ 雅克比迭代法怎么计算
雅可比迭代法可求解线性方程组,也可用于求实对称矩阵的特征值。关于特征值求解举一例。
上面《Jacobⅰ迭代法》仅迭代一次就得到准确解。但该矩阵用 《QR迭代法》迭代多次为啥得近似答案?因为对称矩阵更适合用Jacobⅰ迭代法,迭代次数少且答案准确。
❸ jacobi迭代的算法怎么老是出错
你的算法好像有问题吧,我这里有一个完整的程序,你好好研读一下:
#include <iostream.h>
#include <stdlib.h>
#include <math.h>
double* allocmem(int ); //分配内存空间函数
void gausslinemain(double*,double*,double*,int );//采用高斯列主元素消去法求解x的初始向量值
void jacobi(double*,double*,double*,double*,int,int);//利用雅可比迭代公式求解x的值
void main()
{
short matrixnum; //矩阵的行数(列数)
double *matrixa; //矩阵a,初始系数矩阵
double *matrixd; //矩阵d为a中的主对角阵
double *matrixl; //矩阵l为a中的下三角阵
double *matrixu; //矩阵u为a中的上三角阵
double *b; //矩阵b为雅可比方法迭代矩阵
double *f; //矩阵f为中间的过渡的矩阵
double *x; //x为一维数组,存放结果
double *xk; //xk为一维数组,用来在迭代中使用
// double *b; //b为一维数组,存放方程组右边系数
int i,j,k;
cout<<"<<请输入矩阵的行数(列数与行数一致)>>:";
cin>>matrixnum;
//分别为a、d、l、u、b、f、x、b分配内存空间
matrixa=allocmem(matrixnum*matrixnum);
matrixd=allocmem(matrixnum*matrixnum);
matrixl=allocmem(matrixnum*matrixnum);
matrixu=allocmem(matrixnum*matrixnum);
b=allocmem(matrixnum*matrixnum);
f=allocmem(matrixnum);
x=allocmem(matrixnum);
xk=allocmem(matrixnum);
b=allocmem(matrixnum);
//输入系数矩阵各元素值
cout<<endl<<endl<<endl<<"<<请输入矩阵中各元素值(为 "<<matrixnum<<"*"
<<matrixnum<<",共计 "<<matrixnum*matrixnum<<" 个元素)"<<">>:"<<endl<<endl;
for(i=0;i<matrixnum;i++)
{
cout<<"请输入矩阵中第 "<<i+1<<" 行的 "<<matrixnum<<" 个元素:";
for(j=0;j<matrixnum;j++)
cin>>*(matrixa+i*matrixnum+j);
}
//输入方程组右边系数b的各元素值
cout<<endl<<endl<<endl<<"<<请输入方程组右边系数各元素值,共计 "<<matrixnum<<
" 个"<<">>:"<<endl<<endl;
for(i=0;i<matrixnum;i++)
cin>>*(b+i);
/* 下面将a分裂为a=d-l-u */
//首先将d、l、u做初始化工作
for(i=0;i<matrixnum;i++)
for(j=0;j<matrixnum;j++)
*(matrixd+i*matrixnum+j)=*(matrixl+i*matrixnum+j)=*(matrixu+i*matrixnum+j)=0;
//d、l、u分别得到a的主对角线、下三角和上三角;其中d取逆矩阵、l和u各元素取相反数
for(i=0;i<matrixnum;i++)
for(j=0;j<matrixnum;j++)
if(i==j&&*(matrixa+i*matrixnum+j)) *(matrixd+i*matrixnum+j)=1/(*(matrixa+i*matrixnum+j));
else if(i>j) *(matrixl+i*matrixnum+j)=-*(matrixa+i*matrixnum+j);
else *(matrixu+i*matrixnum+j)=-*(matrixa+i*matrixnum+j);
//求b矩阵中的元素
for(i=0;i<matrixnum;i++)
for(j=0;j<matrixnum;j++)
{
double temp=0;
for(k=0;k<matrixnum;k++)
temp+=*(matrixd+i*matrixnum+k)*(*(matrixl+k*matrixnum+j)+*(matrixu+k*matrixnum+j));
*(b+i*matrixnum+j)=temp;
}
//求f中的元素
for(i=0;i<matrixnum;i++)
{
double temp=0;
for(j=0;j<matrixnum;j++)
temp+=*(matrixd+i*matrixnum+j)*(*(b+j));
*(f+i)=temp;
}
/* 计算x的初始向量值 */
gausslinemain(matrixa,x,b,matrixnum);
/* 利用雅可比迭代公式求解xk的值 */
int jacobitime;
cout<<endl<<endl<<endl<<"<<雅可比迭代开始,请输入希望迭代的次数>>:";
cin>>jacobitime;
while(jacobitime<=0)
{
cout<<"迭代次数必须大于0,请重新输入:";
cin>>jacobitime;
}
jacobi(x,xk,b,f,matrixnum,jacobitime);
//输出线性方程组的解 */
cout<<endl<<endl<<endl<<"<<方程组运算结果如下>>"<<endl;
cout.precision(20); //设置输出精度,以此比较不同迭代次数的结果
for(i=0;i<matrixnum;i++)
cout<<"x"<<i+1<<" = "<<*(xk+i)<<endl;
cout<<endl<<endl<<"求解过程结束..."<<endl<<endl;
//释放掉所有动态分配的内存
delete [] matrixa;
delete [] matrixd;
delete [] matrixl;
delete [] matrixu;
delete [] b;
delete [] f;
delete [] x;
delete [] xk;
delete [] b;
}
/*
----------------------
分配内存空间函数
----------------------
*/
double* allocmem(int num)
{
double *head;
if((head=new double[num])==NULL)
{
cout<<"内存空间分配失败,程序终止运行!"<<endl;
exit(0);
}
return head;
}
/*
-----------------------------------------------
计算ax=b中x的初始向量值,采用高斯列主元素消去法
-----------------------------------------------
*/
void gausslinemain(double* a,double* x,double* b,int num)
{
int i,j,k;
//共处理num-1行
for(i=0;i<num-1;i++)
{
//首先每列选主元,即最大的一个
double linemax=fabs(*(a+i*num+i));
int linei=i;
for(j=i;j<num;j++)
if(fabs(*(a+j*num+i))>fabs(linemax)) linei=j;
//主元所在行和当前处理行做行交换,右系数b也随之交换
for(j=i;j<num;j++)
{
//a做交换
linemax=*(a+i*num+j);
*(a+i*num+j)=*(a+linei*num+j);
*(a+linei*num+j)=linemax;
//b中对应元素做交换
linemax=*(b+i);
*(b+i)=*(b+linei);
*(b+linei)=linemax;
}
if(*(a+i*num+i)==0) continue; //如果当前主元为0,本次循环结束
//将a变为上三角矩阵,同样b也随之变换
for(j=i+1;j<num;j++)
{
double temp=-*(a+j*num+i)/(*(a+i*num+i));
for(k=i;k<num;k++)
{
*(a+j*num+k)+=temp*(*(a+i*num+k));
}
*(b+j)+=temp*(*(b+i));
}
}
/* 验证ax=b是否有唯一解,就是验证a的行列式是否为0;
如果|a|!=0,说明有唯一解
*/
double determinanta=1;
for(i=0;i<num;i++)
determinanta*=*(a+i*num+i);
if(determinanta==0)
{
cout<<endl<<endl<<"通过计算,矩阵a的行列式为|a|=0,即a没有唯一解。\n程序退出..."<<endl<<endl;
exit(0);
}
/* 从最后一行开始,回代求解x的初始向量值 */
for(i=num-1;i>=0;i--)
{
for(j=num-1;j>i;j--)
*(b+i)-=*(a+i*num+j)*(*(x+j));
*(x+i)=*(b+i)/(*(a+i*num+i));
}
}
/*
--------------------------------------
利用雅可比迭代公式求解x的精确值
迭代公式为:xk=bx+f
--------------------------------------
*/
void jacobi(double* x,double* xk,double* b,double* f,int num,int time)
{
int t=1,i,j;
while(t<=time)
{
for(i=0;i<num;i++)
{
double temp=0;
for(j=0;j<num;j++)
temp+=*(b+i*num+j)*(*(x+j));
*(xk+i)=temp+*(f+i);
}
//将xk赋值给x,准备下一次迭代
for(i=0;i<num;i++)
*(x+i)=*(xk+i);
t++;
}
}
❹ 雅可比椭圆函数计算算法
1.雅可比椭圆函数。
在有限复平面上亚纯的双周期函数。所谓双周期函数是指具有两个基本周期的单复变函数 ,即存在ω1,ω2两个非0复数,Image:椭圆函数1.jpg,而对任意整数n,m,有f(z+nω1+mω2)=f(z) ,于是{nω1+mω2|n,m为整数}构成f(z)的全部周期,在复平面上任取一点a,以a,a+ω1,a+ω1+ω2 ,a+ω2为顶点的平行四边行的内部 ,再加上两个相邻的边及其交点 ,这样构成的一个半开的区域称为f(z)的一个基本周期平行四边形,将它平行移动nω1+mω2,当n,m取遍所有整数时,即得一覆盖整个复平面的周期平行四边形网,f(z) 在每一个周期平行四边形中的性质都和它在基本周期平行四边形中的一样。在基本周期平行四边形中,f(z)有以下性质:非常数椭圆函数一定有极点,且极点留数之和必为零 ,因而不可能只有一个一阶极点 ,有n个极点的椭圆函数称为n阶椭圆函数 ,它在基本周期平行四边形内取任一值n次,即对任意复数A,f(z)-A在基本周期平行四边形内有且仅有n个零点 ,且f(z) 的零点之和与极点之和的差必等于一个周期。
在以上性质的规范下 ,有两大类重要的椭圆函数 :①魏尔斯特拉斯-δ函数 。它表作Image:椭圆函数2.jpg,其中ω=2nω1+2mω2,∑'表n,m取遍全部整数之和 ,但要除去ω=0的情形 。这是一个二阶椭圆函数 ,在周期平行四边形中 ,仅有一个ω是二阶极点 ,ω=δ(z)满足微分方程(ω′)2=4ω3-g2ω-g3,其中g2=60∑'Image:椭圆函数3.jpgg3=140∑'Image:椭圆函数4.jpg,由此可见ω=δ(z)是Image:椭圆函数5.jpg的反函数,右边的积分称为椭圆积分。可以证明,所有的椭圆函数都可以用δ(z)函数来表示 ,而每一个椭圆函数都一定满足一个常系数一阶的代数微分方程。②雅可比椭圆函数。它定义为椭圆积分Image:椭圆函数6.jpg 的反函数 ,记作ω=J(z),J(z)的基本周期平行四边形是一个矩形 ,其基本周期是4K与2iK′ ,此处Image:椭圆函数7.jpg,Image:椭圆函数8.jpg,其二阶极点为iK′,而k是一个实常数。
2.雅可比椭圆函数。它定义为椭圆积分Image:椭圆函数6.jpg 的反函数 ,记作ω=J(z),J(z)的基本周期平行四边形是一个矩形 ,其基本周期是4K与2iK′ ,此处Image:椭圆函数7.jpg,Image:椭圆函数8.jpg,其二阶极点为iK′,而k是一个实常数。
❺ 电力系统潮流计算中,保留非线性潮流算法为什么只计算一次雅可比矩阵
首先,保留非线性潮流算法是为提高PQ分解潮流算法精度引入的,PQ分解法的雅可比矩阵只需要计算一次(原因请看书)。
其次,雅可比矩阵即为潮流计算方程的一阶导数,对于PQ分解算法,状态变量修正量dx的计算方程可以表示为J*dx=b。当保留非线性项时,非线性项构成的矩阵与二次变量相乘形成向量c,将其移到等式右边,而计算c时所用到的状态变量及状态变量的修正量近似取为与状态变量初值和上一次状态变量估计值有关,因此雅可比矩阵还是不会变,变的只是等式右边:J*dx=b+c。
❻ 雅可比法求对称矩阵的特征值的并行算法
如果把所有非对角元扫描一遍作为一次迭代,那么几步迭代后就能收敛,换句话说需要O(n^2)步旋转才能收敛,因为Jacobi算法具有渐进二次收敛性。
Jacobi算法一般比较慢,但是如果慢的过分一般来讲是你的代码有问题,你可以把非对角元的平方和输出出来观察一下收敛速度。
❼ 如何判断雅各比迭代法,高斯赛德尔迭代法是否收敛
高斯迭代法可看作是雅克比迭代法的一种修正。两者的收敛速度在不同条件下不同,不能直接比较,即使在同样条件下,有可能对于同样的系数矩阵出现一种方法收敛,一种方法发散。
计算谱半径,普半径小于1,则收敛,否则不收敛。其中谱半径就是迭代矩阵J或者G的最大特征值。
也可用列范数或行范数判断,列范数或者行范数小于1,则收敛。但范数大于1时,不能说明其发散,还要通过计算谱半径来确定其收敛性。
(7)雅克比算法扩展阅读:
在数值线性代数中是用于求解线性方程组的迭代方法。 它以德国数学家卡尔·弗里德里希·高斯(Carl Friedrich Gauss)和菲利普·路德维希·冯·塞德尔(Philipp Ludwig von Seidel)命名,与雅可比方法相似。
虽然它可以应用于对角线上具有非零元素的任何矩阵,但只能在矩阵是对角线主导的或对称的和正定的情况下,保证收敛。
❽ 矩阵特征值分解的两种方法:jacobi分解方法和QR分解方法的各自优点、缺点是什么,请计算数学专业高手解答
■ 雅可比正交相似变换,适用于实对称矩阵求特征值,且计算结果很准确;当用于非对称矩阵时收敛效果并不好。
■ QR正交相似变换,一般认为对任意中小型矩阵都可求特征值,实际上最适合非对称矩阵,计算结果准确。对称矩阵用QR正交相似变换时,收敛效果反而不理想。
❾ 雅可比方法的主要特点是什么
1.结构化分析方法简单、清晰,易于学习掌握和使用.2.结构化分析的实施步骤是先分析当前现实环境中已存在的人工系统,在此基础上再构思即将开发的目标系统,这符合人们认识世界改造世界的一般规律,从而大大降低了问题的复杂程度.目前一些其它的需求分析方法,在该原则上是与结构化分析相同的.3.结构化分析采用了图形描述方式,用数据流图为即将开发的系统描述了一个可见的模型,也为相同的审查和评价提供了有利的条件.从上到下把大问题分解成若干个小问题,然后分别解决工具:CASE ,MICROSOFT VISIO