当前位置:首页 » 编程语言 » 雅可比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)。对许多力学实际问题,可以通过分离变 量法求出哈密顿-雅可比方程的全积分。对于工程上的保守系统,用此法计算繁琐,但它对天体力学的摄动法却大有帮助。