当前位置:首页 » 编程语言 » jacobi迭代法c语言

jacobi迭代法c语言

发布时间: 2022-03-07 19:09:18

A. 急需一个运用雅可比迭代法求线性方程组的C/C++程序!

我有高斯赛德尔的,你拿过去改一改可用吧?
#include <iostream>
#include <time.h>
#include <math.h>
#include <cstdlib>
#include <fstream>
using std::cin;
using std::cout;
using std::endl;
using std::ofstream;

#define MAX 10000 // it can be changed when it is needed

double a[MAX][MAX], b[MAX], result[MAX], x[MAX], tmp[MAX], eps, temp;
int n, i, j, k;
ofstream ouc("GSresult.txt");
clock_t start, finished;

bool molus() {
for (i = 0; i < n; i++) {
for (tmp[i] = -b[i], j = 0; j < n; j++) tmp[i] += a[i][j] * x[j];
tmp[i] = fabs(tmp[i]);
}
for (i = 1; i < n; i++) if (tmp[0] < tmp[i]) tmp[0] = tmp[i];
return tmp[0] > eps;
}

int main() {
while (cin >> n >> eps) {
// the input term
srand(time(0));
for(i = 0; i < n; i++)
result[i] = (double)(rand() % 10000) / 100.0;
for(i = 0; i < n; i++) {
for(b[i] = 0, j = 0; j < n;j++) {
if (j == i) while (fabs(a[i][j]) < 1000) a[i][j] = (double) (rand() % 10000);
else {
k = (rand() % 2 == 0) ? 1 : (-1);
a[i][j] = k * (double) (rand() % 10000) / 1000.0;
}
b[i] += a[i][j] * result[j];
}
x[i] = 1.1;
}

// algorithms term
start = clock(); // clock started
k = 0;
while (molus()) {
for (i = 0; i < n; i++) {
for (temp = 0, j = 0; j < i; j++) temp += a[i][j] * x[j];
for (j = i + 1; j < n; j++) temp += a[i][j] * x[j];
x[i] = (b[i] - temp) / a[i][i];
}
k++;
}

// final version
for (i = 0, temp = 0; i < n; i++) temp += (x[i] - result[i]) * (x[i] - result[i]);
temp = sqrt(temp / n);
finished = clock(); // clock end
ouc << "When n is " << n << "; eps is " << eps << "; then the result {X} is\n\t";
for (i = 0; i < n; i++) ouc << x[i] << " ";
ouc << "\nTime is: " << finished - start << "; Precision is: " << temp << "; Iteration times are " << k << "\n\n";
}
cout << "Thank you!\n";
}

B. 雅克比迭代法求解线性方程组的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;
}

C. C语言,关于雅可比法求矩阵的特征值和特征向量的迭代次数

如果把所有非对角元扫描一遍作为一次迭代,那么几步迭代后就能收敛,换句话说需要O(n^2)步旋转才能收敛,因为Jacobi算法具有渐进二次收敛性。

Jacobi算法一般比较慢,但是如果慢的过分一般来讲是你的代码有问题,你可以把非对角元的平方和输出出来观察一下收敛速度。

D. Jacobi迭代法和Gauss-Seidel迭代法有什么区别

迭代公式有点差别,计算精度也不相同。

E. 雅克比迭代法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

F. 用C语言编译雅可比迭代法,程序总是无法运行,为什么

在c语言中数组说明的一般形
式为:
类型说明符
数组名
[常量表达式],……;
其中,类型说明符是任一种基本数据类型或构造数据类型。
数组名是用户定义的数组标识符。
方括号中的常量表达式表示数据元素的个数,也称为数组的长度。例如:
int
a[10];
说明整型数组a,有10个元素。
float
b[10],c[20];
说明实型数组b,有10个元素,实型数组c,有20个元素。
char
ch[20];
说明字符数组ch,有20个元素。
对于数组类型说明应注意以下几点:
1.数组的类型实际上是指数组元素的取值类型。对于同一个数组,其所有元素的数据类型都是相同的。
2.数组名的书写规则应符合标识符的书写规定。
3.数组名不能与其它变量名相同,例如:
void
main()
{
int
a;
float
a[10];
……
}
是错误的。
4.方括号中常量表达式表示数组元素的个数,如a[5]表示数组a有5个元素。但是其下标从0开始计算。因此5个元素分别为a[0],a[1],a[2],a[3],a[4]。
5.不能在方括号中用变量来表示元素的个数,
但是可以是符号常数或常量表达式。例如:
#define
fd
5
void
main()
{
int
a[3+2],b[7+fd];
……
}
是合法的。但是下述说明方式是错误的。
void
main()
{
int
n=5;
int
a[n];
……
}
明白了吧你所定义的数组的个数n是变量,而规定中必须是常量的,另外这一行少了"*"号
else
y[i]=(b[i]-a[i][j]x[i])/a[i][i];
应该为else
y[i]=(b[i]-a[i][j]*x[i])/a[i][i];

G. 雅可比迭代法的工作原理

雅克比迭代法就是众多迭代法中比较早且较简单的一种,其命名也是为纪念普鲁士着名数学家雅可比。雅克比迭代法的计算公式简单,每迭代一次只需计算一次矩阵和向量的乘法,且计算过程中原始矩阵A始终不变,比较容易并行计算。

概念

考虑线性方程组Ax =b时,一般当A为低阶稠密矩阵时,用主元消去法解此方程组是有效方法。但是,对于由工程技术中产生的大型稀疏矩阵方程组(A的阶数很高,但零元素较多,例如求某些偏微分方程数值解所产生的线性方程组),利用迭代法求解此方程组就是合适的,在计算机内存和运算两方面,迭代法通常都可利用A中有大量零元素的特点。雅克比迭代法就是众多迭代法中比较早且较简单的一种,其命名也是为纪念普鲁士着名数学家雅可比。

折叠编辑本段迭代过程

迭代过程

首先将方程组中的系数矩阵A分解成三部分,即:A = L+D+U,如图1所示,其中D为对角阵,L为下三角矩阵,U为上三角矩阵。

之后确定迭代格式,X^(k+1) =B*X^(k) +f,(这里^表示的是上标,括号内数字即迭代次数),如图2所示,其中B称为迭代矩阵,雅克比迭代法中一般记为J。(k = 0,1,......)

再选取初始迭代向量X^(0),开始逐次迭代。

折叠编辑本段收敛性

设Ax= b,其中A=D+L+U为非奇异矩阵,且对角阵D也非奇异,则当迭代矩阵J的谱半径ρ(J)<1时,雅克比迭代法收敛。

折叠编辑本段优缺点

雅克比迭代法的优点明显,计算公式简单,每迭代一次只需计算一次矩阵和向量的乘法,且计算过程中原始矩阵A始终不变,比较容易并行计算。然而这种迭代方式收敛速度较慢,而且占据的存储空间较大,所以工程中一般不直接用雅克比迭代法,而用其改进方法。

折叠编辑本段程序实现示例

#include<stdio.h>

#include<math.h>

#include <stdlib.h>

main(){

float e=0.001,z,m,a[3][3]={5,2,1,-1,4,2,2,-3,10},b[3]={-12,20,3},x[3]={0,0,0},y[3];

int n=3,j,i,k=1;

while(1) {

for(i=0;i<3;i++) {

for(j=0;j<3;j++)

m=m+a[i][j]*x[j];

m=m-x[i]*a[i][i];

y[i]=(b[i]-m)/a[i][i];

m=0;

}

i=0;

while(i<3) {

z=fabs(x[i]-y[i]);

if(z>e)

break;

i++;

}

if(i!=3) {

for(i=0;i<3;i++)

x[i]=y[i];

k++;

}

else if(i==3)

break;

}

printf("%f %f %f ",y[0],y[1],y[2]);

}

H. 求雅可比迭代法解方程组的C\C++程序

/************************************
下面程序是解下面这个方程:(可以改变方程系,程序即可解不同的方程)
方程:
5x1+2x2+x3=8
2x1+8x2-3x3=21
x1-3x2-6x3=1

用VC6.0编译,保存代码时,以.C为后缀名

************************************/
#include<malloc.h>
#include<stdio.h>
#include<conio.h>
#include<math.h>

#define EPS 1e-6/*允许误差*/
#define MAX 100/*迭代次数的最大值*/
float *Jacobi(float a[3][4],int n);

main()
{
int i;
float a[3][4]={5,2,1,8,2,8,-3,21,1,-3,-6,1};/*方程的系数*/
float *x;
x=(float *)malloc(3*sizeof(float));/*动态申请内存,用于保存方程的解*/
x=Jacobi(a,3);/*调用雅可比函数*/
for(i=0;i<3;i++)/*输出方程的解*/
{
printf("x[%d]=%f\t",i,x[i]);
}
printf("\n");
getch();
}
float *Jacobi(float a[3][4],int n)
{
float *x,*y;
float epsilon,s;
int i,j,k=0;
x=(float *)malloc(n*sizeof(float));
y=(float *)malloc(n*sizeof(float));
for(i=0;i<n;i++)
x[i]=0;
while(1)
{
epsilon=0;/*容允误差*/
k++;/*迭代次数计数*/
for(i=0;i<n;i++)
{
s=0;
for(j=0;j<n;j++)
{
if(j==i)
{
continue;
}
s+=a[i][j]*x[j];
}
y[i]=(a[i][n]-s)/a[i][i];/*计算"x^(k+1)"*/
epsilon+=(float)fabs(y[i]-x[i]);
}
if(epsilon<EPS)
{
printf("迭代次数为:%d\n",k);
return x;/*返回方程的解*/
}
if(k>=MAX)
{
printf("方程不收敛\n");
return y;
}
for(i=0;i<n;i++)
{
x[i]=y[i];
}
}
}

I. 网上找的用C语言实现的雅克比迭代法,显示一个错误哪里有错

主函数和各个函数都没有返回值,可以把函数类型改为void就没有事了 。如主函数写成:
void main()
其他的函数名前的float写成void

热点内容
商城前端源码 发布:2025-01-13 14:08:43 浏览:48
每个人身上都有密码是什么 发布:2025-01-13 14:08:40 浏览:472
怎么看java 发布:2025-01-13 13:54:18 浏览:10
没脚本导演 发布:2025-01-13 13:52:22 浏览:339
获取android签名 发布:2025-01-13 13:40:21 浏览:595
单片机编译器和驱动 发布:2025-01-13 13:31:33 浏览:440
tis服务器怎么进pe 发布:2025-01-13 13:31:02 浏览:277
android线程与线程通信 发布:2025-01-13 13:30:27 浏览:39
FTP服务器本地策略 发布:2025-01-13 13:20:47 浏览:486
地下城堡2挂机脚本 发布:2025-01-13 13:20:44 浏览:206