雅克比演算法
❶ 計算雅克比符號的演算法和程序(我找到一個計算雅克比符號的程序可是看不懂,請高手幫幫忙!指點一下!)
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