當前位置:首頁 » 編程語言 » 雅可比c語言舉例
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

雅可比c語言舉例

發布時間: 2022-04-25 08:31:14

c語言,關於雅可比法求矩陣的特徵值和特徵向量的迭代次數

如果把所有非對角元掃描一遍作為一次迭代,那麼幾步迭代後就能收斂,換句話說需要O(n^2)步旋轉才能收斂,因為Jacobi演算法具有漸進二次收斂性。

Jacobi演算法一般比較慢,但是如果慢的過分一般來講是你的代碼有問題,你可以把非對角元的平方和輸出出來觀察一下收斂速度。

㈡ C語言Jacobi法求解實對稱矩陣的全部特徵值和特徵向量

最近也用到呢,網上下的代碼,未經驗證,給你參考一下吧
//雅可比法求實對稱矩陣的特徵值與特徵向量
void Jacobi(int n,float (*a)[7][7],float (*s)[8][8]) //n為矩陣階數,a為輸入矩陣,s為輸出矩陣
{
int i,j,i1,l,iq,iql,ip;
float g,s1,s2,s3,v1,v2,v3,u,st,ct;

for(i=0;i<=n;i++)
{
for(j=0;j<=i;j++)
{
if((i-j)==0)
(*s)[i][j]=1;
else
{
(*s)[i][j]=0.0;
(*s)[j][i]=0.0;
}
}
}
g=0;
for(i=1;i<n;i++)
{
i1=i-1;
for(j=0;j<=i1;j++)
g=g+2*(*a)[i][j]*(*a)[i][j];
}
s1=sqrt(g);
s2=min/(n)*s1;
s3=s1;

do
{
s3=s3/(n);
do
{
l=0;
for(iq=1;iq<n;iq++)
{
iql=iq-1;
for(ip=0;ip<=iql;ip++)
{
if(fabs((*a)[ip][iq])>=s3)
{
l=1;
v1=(*a)[ip][ip];
v2=(*a)[ip][iq];
v3=(*a)[iq][iq];
u=0.5*(v1-v3);
if(u==0)
g=1;
if(fabs(u)>=1e-10)
g=-(u/fabs(u)*l)*v2/sqrt(v2*v2+u*u);
st=g/sqrt(2*(l+sqrt(l-g*g)));
ct=sqrt(1-st*st);
for(i=0;i<n;i++)
{
g=(*a)[i][ip]*ct-(*a)[i][iq]*st;
(*a)[i][iq]=(*a)[i][ip]*st+(*a)[i][iq]*ct;
(*a)[i][ip]=g;
g=(*s)[i][ip]*ct-(*s)[i][iq]*st;
(*s)[i][iq]=(*s)[i][ip]*st+(*s)[i][iq]*ct;
(*s)[i][ip]=g;
}
for(i=0;i<n;i++)
{
(*a)[ip][i]=(*a)[i][ip];
(*a)[iq][i]=(*a)[i][iq];
}
g=2*v2*st*ct;
(*a)[ip][ip]=v1*ct*ct+v3*st*st-g;
(*a)[iq][iq]=v1*st*st+v3*ct*ct+g;
(*a)[ip][iq]=(v1-v3)*st*ct+v2*(ct*ct-st*st);
(*a)[iq][ip]=(*a)[ip][iq];
}
}
}
}while(l==1);
}while(s3>s2);

}

㈢ 求雅可比迭代法的程序流程圖及3×3結構的C程序

#include<stdio.h>
#include<math.h>
main()
{
int n,M,i,j;
printf("請輸入希望迭代的次數");
scanf("%d",&M);
printf("請輸入方程階數");
scanf("%d",&n);
float p,y[n],x[n],a[n][n],b[n];
printf("請輸入誤差限");
scanf("%f",&p);
printf("請輸入系數行列式");
for(i=0;i<n;i++)
for(j=0;j<n;j++)
scanf("%f",&a[i][j]);
printf("請輸入常數項向量");
for(i=0;i<n;i++)
scanf("%f",&b[i]);
printf("請輸入初始向量");
for(i=0;i<n;i++)
scanf("%f",&x[i]);
for(k=1;k<=M;k++)
{
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
if(j==i) continue;
else y[i]=(b[i]-a[i][j]x[i])/a[i][i];
}
for(i=0;i<n;i++)
if(fabs(x[i]-y[i])<p)
for(i=0;i<n;i++)
{
printf("x%d=%f",i+1,y[i]);break;
}
else for(i=0;i<n;i++)
x[i]=y[i];
}
if(k>M) printf("沒有得到在誤差范圍內的根");
}

㈣ 雅可比求數組根的程序(c語言)

?你是在什麼平台下的什麼工具?是XP下的vc6.0之類的嗎?我這里運行N個錯誤。
在C語言當中數組肯定不可以如此動態申請!!!沒有語法錯誤估計是你版本的問題
你要想動態申請必須用指針,而且在C語言中只能動態申請一維數組,C++中可以二維。
C語言動態申請例:
int *p;
p = (int*)malloc(sizeof(int) * n);
在C語言中想要動態的二維數組,那麼可以用一維來表示。比如一個3*5的數組,那麼一共需要15個空間,我們這么申請
p = (int*)malloc(sizeof(int) *(3 * 5))
p[i][j]可以這么表示p[i+(3*i + j)].

那就愛莫能助了,因為在我這里運行不了

㈤ 用雅可比迭代法求解一個三階矩陣的演算法的C語言源代碼

求什麼3階矩陣啊? 是求方程吧
高斯法我有,別的就沒有了,你網上找找吧

double *Gauss(int n,double a[],double b[]) //數組a、b對應於線性方程組AX=B中的向量A、B
{
int i,j,k,*js,is;
double max,t;
js=malloc(n*sizeof(int)); // 開辟用於記錄列交換位置的動態空間

for(k=0;k <n-1;k++)
{
max=0.0;
for(i=k;i <n;i++) // 全選主元
for(j=k;j <n;j++)
{
t=fabs(a[i*n+j]);
if(t> max)
{
max=t;
js[k]=j;
is=i;
}
}

if(max+1.0==1.0) // 如果系數矩陣奇異,就返回相關信息並退出
{
free(js);
printf( "\nHas not exclusive result or has not result!\n ");
}

else
{
if(js[k]!=k) // 列交換
for(i=0;i <n;i++)
{
t=a[i*n+k];
a[i*n+k]=a[i*n+js[k]];
a[i*n+js[k]]=t;
}
if(is!=k)
{
for(j=k;j <n;j++) //行交換
{
t=a[k*n+j];
a[k*n+j]=a[is*n+j];
a[is*n+j]=t;
}
t=b[k];
b[k]=b[is];
b[is]=t;
}
}

max=a[k*n+k];

for(j=k+1;j <n;j++) // 歸一化
a[k*n+j]/=max;

b[k]/=max;

for(i=k+1;i <n;i++) // 消元
{
for(j=k+1;j <n;j++)
a[i*n+j]-=a[i*n+k]*a[k*n+j];

b[i]-=a[i*n+k]*b[k];
}
}

max=a[(n-1)*n+(n-1)];

if(fabs(max)+1.0==1.0) //如果系數矩陣奇異,就返回相關信息並退出
{
free(js);
printf( "\nHas not exclusive result or has not result!\n ");
}

b[n-1]/=max; //以下為回代,而這一步計算向量的最後一個分量

for(k=n-2;k>=0;k--)
{
t=0.0;
for(j=k+1;j<n;j++) t+=a[k*n+j]*b[j];
b[k]-=t; //這時數組b用來記錄解向量,而不是原來的常數向量
}

js[n-1]=n-1; //最後一步的系數矩陣的右下角(n-k+1)階子陣只有一個元素a[n-1][n-1],絕對值最大的當然是這個元素了

for(k=n-1;k>=0;k--)
if(js[k]!=k)
{
t=b[k];
b[k]=b[js[k]];
b[js[k]]=t;
}
free(js);

return(b);
}

㈥ 如何用c語言將數學表達式轉為雅可比矩陣

需要藉助於printf()函數

㈦ 雅克比迭代法c語言程序,急!

double
a[N][N]={
0,0,0,0,
0.78,-0.02,-0.12,-0.14,
-0.02,0.86,-0.04,0.06,
-0.12,-0.04,0.72,-0.08,
-0.14,0.06,-0.08,0.74},
你定義的N為4,4*4=16,但你初始化有20個值,建議改成4*5,或5*5

㈧ 雅克比迭代法求解線性方程組的C語言程序

void Solve ( double dCoef [] , double dY [] , unsigned int iOrder , double dErr)
{//用Jacobi迭代法解方程組, dCoef[]系數陣, Y[]向量, iOrder給出方程階數, dErr給出精度

double res [Max]; //方程解
double res2[Max]; //保存上一階方程解

if ( Max < iOrder )
{
printf ("最多支持%d階方程組.", Max);
return;
}
for ( unsigned int i = 0 ; i < iOrder ; res2 [i++] = 0.0 ); //初始解向量 (0,0...)

while ( true )
{
bool bStopIterative = true;
for (unsigned int i = 0 ; i < iOrder ; ++i)
{
double dSum2 = 0;
for (unsigned int j = 0 ; j < iOrder ; j++)
{//求第二項
if ( j == i ) continue;
dSum2 += dCoef [i * iOrder + j] * res2 [j];
}
res[i] = 1/dCoef[i * iOrder + i] * ( dY[i] - dSum2 );

if ( abs ( res2[i] - res [i] ) > dErr )
bStopIterative = false;
}

if ( bStopIterative )
break;
for (unsigned int i = 0 ; i < iOrder ; i++ )
res2[ i ] = res[ i ];
}

//輸出結果
for (unsigned int i = 0 ; i < iOrder ; i++)
printf ("x%d = %lf\n", i+1 , res[i]);

}

int main(int argc, char* argv[])
{
double a[] =
{
8,-3,2,
4,11,-1,
2,1,4
};
double b[3] =
{
20,33,12
};

Solve ( a , b , 15 , 1e-10);
getchar();
return 0;
}

㈨ Jacobi法求實對稱矩陣的特徵值與特徵向量(c語言,不要復制的,能注釋清楚更好)

void Jacobi(int n,float (*a)[7][7],float (*s)[8][8]) //n為矩陣階數,a為輸入矩陣,s為輸出矩陣{ int i,j,i1,l,iq,iql,ip; float g,s1,s2,s3,v1,v2,v3,u,st,ct; for(i=0;i<=n;i++) { for(j=0;j<=i;j++) { if((i-j)==0) (*s)[i][j]=1; else { (*s)[i][j]=0.0; (*s)[j][i]=0.0; } } } g=0; for(i=1;i<n;i++) { i1=i-1; for(j=0;j<=i1;j++) g=g+2*(*a)[i][j]*(*a)[i][j]; } s1=sqrt(g); s2=min/(n)*s1; s3=s1; do { s3=s3/(n); do { l=0; for(iq=1;iq<n;iq++) { iql=iq-1; for(ip=0;ip<=iql;ip++) { if(fabs((*a)[ip][iq])>=s3) { l=1; v1=(*a)[ip][ip]; v2=(*a)[ip][iq]; v3=(*a)[iq][iq]; u=0.5*(v1-v3); if(u==0) g=1; if(fabs(u)>=1e-10) g=-(u/fabs(u)*l)*v2/sqrt(v2*v2+u*u); st=g/sqrt(2*(l+sqrt(l-g*g))); ct=sqrt(1-st*st); for(i=0;i<n;i++) { g=(*a)[i][ip]*ct-(*a)[i][iq]*st; (*a)[i][iq]=(*a)[i][ip]*st+(*a)[i][iq]*ct; (*a)[i][ip]=g; g=(*s)[i][ip]*ct-(*s)[i][iq]*st; (*s)[i][iq]=(*s)[i][ip]*st+(*s)[i][iq]*ct; (*s)[i][ip]=g; } for(i=0;i<n;i++) { (*a)[ip][i]=(*a)[i][ip]; (*a)[iq][i]=(*a)[i][iq]; } g=2*v2*st*ct; (*a)[ip][ip]=v1*ct*ct+v3*st*st-g; (*a)[iq][iq]=v1*st*st+v3*ct*ct+g; (*a)[ip][iq]=(v1-v3)*st*ct+v2*(ct*ct-st*st); (*a)[iq][ip]=(*a)[ip][iq]; } } } }while(l==1); }while(s3>s2); }

㈩ 什麼是雅可比(Jacobi)式

哈密頓-雅可比方程
Hamilton-Jacobi equation
分析力學中用以求解正則方程的一個偏微分方程 。由CGJ雅可比在W.R.哈密頓研究工作基礎上給出而得名 。對於 N 個自由度的完整系統 ,此方程可寫為 :+H(q1,q2,…,qN;,,…,;t)=0,式中H=T2-T0+V為哈密頓函數 ,其中V是用廣義坐標qi (i=1,2,…,N)和時間t表示的勢函數,T2和T0分別為動能T 中用廣義動量表示的二次齊次式和零次齊次式(即不含pi,僅含qi和t之式);S為哈密頓主函數。若自方程求出包含N個任意常數( a1,a2,…,aN)的一個解(稱全積分)S(q1,q2,…,qN;a1,a2,…,aN;t),則由=-βi(β是常量),=pi(i=1,2,…,N)就能求出該系統正則方程的通解:pi=pi(t;a1,…,aN ;β1,…,βN),qi=qi(t;a1,…,aN;β1,…,βN)(i=1,2,…,N)。對許多力學實際問題,可以通過分離變 量法求出哈密頓-雅可比方程的全積分。對於工程上的保守系統,用此法計算繁瑣,但它對天體力學的攝動法卻大有幫助。