1. 程式人生 > >雅克比迭代法與高斯塞德爾迭代法求解方程組(C語言)

雅克比迭代法與高斯塞德爾迭代法求解方程組(C語言)

分別用雅可比 迭代法與高斯塞德爾迭代法解下列方程組:
這裡寫圖片描述
雅可比迭代法:

#include<stdio.h>
#include<math.h>
#define eps 1e-6
#define max 100
//雅可比迭代法
void jacobi(float *a,int n,float x[])
{
    int i,j,k=0;
    float epsilon,s;
    float *y=new float[n];
    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*(n+1)+j)*x[j]; } y[i]=(*(a+i*(n+1)+n)-s)/(*(a+i*(n+1)+i)); epsilon+=fabs(y[i]-x[i]); } for(i=0;i<n;i++)x[i]=y[i]; if
(epsilon<eps) { printf("%d\n",k);return;} if(k>=max) {printf("fasan");return;} } delete y; } void main() { int i; float a[4][5]={10,-1,2,0,-11, 0,8,-1,3,-11, 2,-1,10,0,6, -1,3,-1,11,25}; float
x[4]; jacobi(a[0],4,x); for(i=0;i<4;i++)printf("x[%d]=%f\n",i+1,x[i]); float b[9][10]={31,-13,0,0,0,-10,0,0,0,-15, -13,35,-9,0,-11,0,0,0,0,27, 0,-9,31,-10,0,0,0,0,0,-23, 0,0,-10,79,-30,0,0,0,-9,0, 0,0,0,-30,57,-7,0,-5,0,-20, 0,0,0,0,7,47,-30,0,0,12, 0,0,0,0,0,-30,41,0,0,-7, 0,0,0,0,-5,0,0,27,-2,7, 0,0,0,0,0,0,0,-2,29,-10}; float xx[9]; jacobi(b[0],9,xx); for(i=0;i<9;i++)printf("xx[%d]=%f\n",i+1,xx[i]); }

高斯賽德爾迭代法:

#include<stdio.h>
#include<math.h>
#define N 500
//高斯塞德爾
void gauss(float *a,int n,float x[])
{
    int i,j,k=1;
    float d,dx,eps;
    for(i=0;i<=n-1;i++)x[i]=0.0;
    while(1)
    {
        eps=0;
        for(i=0;i<=n-1;i++)
        {
            d=0;
            for(j=0;j<=n-1;j++)
            {
                if(j==i)continue;
                d+=*(a+i*(n+1)+j)*x[j];
            }
            dx=(*(a+i*(n+1)+n)-d)/(*(a+i*(n+1)+i));
            eps+=fabs(dx-x[i]);
            x[i]=dx;
        }
        if(eps<1e-6)
        {printf("%d\n",k);return;}
        if(k>N)
        {
            printf("fasan\n");
            return;
        }
        k++;
    }
}

void main()
{
    int i;
    float a[4][5]={10,-1,2,0,-11,
                   0,8,-1,3,-11,
                   2,-1,10,0,6,
                   -1,3,-1,11,25};
    float x[4];
    float b[9][10]={31,-13,0,0,0,-10,0,0,0,-15,
                   -13,35,-9,0,-11,0,0,0,0,27,
                   0,-9,31,-10,0,0,0,0,0,-23,
                   0,0,-10,79,-30,0,0,0,-9,0,
                   0,0,0,-30,57,-7,0,-5,0,-20,
                   0,0,0,0,7,47,-30,0,0,12,
                   0,0,0,0,0,-30,41,0,0,-7,
                   0,0,0,0,-5,0,0,27,-2,7,
                   0,0,0,0,0,0,0,-2,29,-10};
    float xx[9];
    gauss(a[0],4,x);
    for(i=0;i<4;i++)printf("x[%d]=%f\n",i+1,x[i]);

    gauss(b[0],9,xx);
    for(i=0;i<9;i++)printf("xx[%d]=%f\n",i+1,xx[i]);
}

相關推薦

雅克求解方程組C語言

分別用雅可比 迭代法與高斯塞德爾迭代法解下列方程組: 雅可比迭代法: #include<stdio.h> #include<math.h> #define eps 1

-求解線性方程組

高斯-塞德爾迭代法也是求解線性方程組解的一種方法,與雅可比不同之處在於,求解某個未知數的某代值時,直接使用上一未知數在該代的值。 C++程式碼如下: #include<stdio.h> #include<math.h> using namespa

【計算方法】雅可比-賽求線性方程根

雅可比迭代法: //雅可比迭代法 void jacobi(float *a,int n,float x[]) { int i,j,k=0; float epsilon,s;

數值分析中的演算法

本例是用java語言實現的,適合於學習數值分析課程的同學借鑑; package c; import java.util.Scanner; public class Demo { public static void main(String []args) {

追趕求解方程組C語言

編寫用追趕法解三對角線方程組的程式,並解下列方程組: #include<stdio.h> #include<math.h> void main() { int

列主元消去求解方程組C語言

用列主元消去法解下列方程組: #include<stdio.h> #include<math.h> void main() { void zhu(float *,int

數值分析C++實現線性方程組-賽

線性方程組的直接解法之後,就輪到迭代解法了,直接解法針對的是低階稠密矩陣,資料量較少,而工程上有更多的是高階係數矩陣,使用迭代法效率更高,佔用的空間較小。 迭代法的最基本思想就是由初始條件,比如說初始解向量隨便列舉一個,就0向量也行,然後進行迭代,k到k+1,一步一步從k=1開始去逼近真實解

基於matlab的Guass-Seidel(--賽) 求解線性方程組

演算法解釋見此:https://blog.csdn.net/zengxyuyu/article/details/53056453   原始碼在此: main.m clear clc A = [8 -3 2;4 11 -1;6 3 12]; b = [20;33;36]; [

-賽

b.txt -10.01 9.05 0.12 1.43 1.22 -4.33 2.67 3.22 1.25 -3.69 -12.37 0.58 #include <stdio.h> #define M 3 main() {     FILE *f;     d

使用python實現-賽的簡單運算

今天傳熱學老師說到高斯-賽德爾迭代法,我就想拿python寫一個小程式來計算。 在網上找例子,發現居然沒有人拿python寫,都是C / C++ / Matlab的。沒有參考答案,真是寫得我焦頭爛額啊。 截圖: #!/usr/bin/env python # -*

-賽guass-seidel C語言實現

#include <iostream> #include <cstdio> #include <cmath> #include <cstring> #in

斐波那契數列的實現遞迴實現c語言

遞迴實現 #include<stdio.h> int Fib(int n){ // 自定義函式 if(n<0) return -1; else if(n==0) return 0; else if(n==1)

求解線性方程組C++實現

本系列是數值分析相關演算法的文章,這次用迭代法求解線性方程組,不同於上次用高斯消元法之類的求解。迭代法對於稀疏矩陣方程組的運算,會大大提高。而如果用高斯相關的演算法求解,會浪費大量資源計算無用的東西,所以有必要研究此演算法。 本文章主要使用了3個演算法,分別是

【最全】經典排序算C語言

排好序 而不是 lock wap 循環 而且 -s 關鍵字 void 本文章包括所有基本排序算法(和其中一些算法的改進算法): 直接插入排序、希爾排序、直接選擇排序、堆排序、冒泡排序、快速排序、歸並排序、基數排序。 算法復雜度比較: 算法分類 一、直接插入排序 一個

指標二級指標筆記C語言

一級指標 存放地址的變數稱為指標變數,指標變數是一種特殊的變數。 一般變數存放的是資料本身,指標變數存放的是資料的地址。 int a = 1 ; //普通變數 int *p = NULL ; //一個指向空的int型別的指標變數 p = &a;

氣泡排序C語言

常用的排序方法有氣泡排序法,選擇排序法,插入排序法以及希爾排序法等。本文著重講解如何利用C程式碼,實現氣泡排序。 首先,要了解什麼是氣泡排序。氣泡排序是常用的一種排序方法,其基本方法就是逐次比較。即一次比較兩個數,若它們的順序錯誤,則它們交換;重複進行,直到沒有需要交換為止。 以升序排序為例: 1、比

演算法7-15:迪傑特拉最短路徑演算法c語言

題目描述 在帶權有向圖G中,給定一個源點v,求從v到G中的其餘各頂點的最短路徑問題,叫做單源點的最短路徑問題。 在常用的單源點最短路徑演算法中,迪傑斯特拉演算法是最為常用的一種,是一種按照路徑長度遞增的次序產生最短路徑的演算法。 可將迪傑斯特拉演算法描述如下: 在本題中,讀入

冒泡排序C語言

#include <stdio.h> #include <stdlib.h> int main() { int a[10],t; printf("input 10 numbers:\n"); for(int i=0;i<10;i++){ scanf(

Linux學習筆記演算法資料結構之 佇列程式碼C語言

1、程式碼在VS2010的C++編譯器中編譯通過,可能有極少部分語法不符合C89標準;bool型別無法使用,用int代替 2、由於VS配置問題,沒有分.c和.h檔案書寫;如果要分,最好將Create_Node和Destory_Node加上static關鍵字修飾,他們只會在所