牛頓下山法求解非線性方程(組)(C實現)

2021-06-05 20:55:20 字數 2933 閱讀 1907

1、演算法描述

(1)符號說明與基本假設

對於非線性方程組:

引入向量:

可將(1)式改寫為

通常考慮方程(2)只有唯一解的情形。

(2)牛頓下山演算法

引入下山因子λ

,產生一下計算格式:

下山因子λ

一般依次取1、1/2、1/4、1/8、……

其中

計算步驟為:

2、c語言實現

newton.h標頭檔案:

#ifndef __newton_h__

#define __newton_h__

// 牛頓下山法求解非線性方程(組)

int newton( double** x0

, int n

, double lmada

, double eps_x

, double eps_f

, void (*f)( double** x, int n)

, void (*df)(double** x, int n)

);#endif

newton.c檔案

#include "newton.h"

#include #include // 計算矩陣的逆

static int inverse( double** dfx, int n )

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

}if ( maxv < 1e-20 )

if ( j != p )

tmp = a[j*n+j];

for ( i = j; i < n; ++i ) a[j*n+i] /= tmp;

for ( i = 0; i < n; ++i ) t[j*n+i] /= tmp;

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

}} memcpy( a, t, row_size * n );

free( t );

free( tarr );

return 0;

}// 計算步長dx

static void calc_dx( double** dx

, double* df

, double* dfx

, double lamda

, int n

) }}

// 計算向量的無窮範數

static double norm_inf( double* a, int n )

for ( i = 1; i < n; ++i )

return ret;

}// 牛頓下山法求解非線性方程組,求解成功返回0,失敗返回-1

int newton ( double** x0 // 迭代起始點

, int n // 方程組維數

, double lamda // 起始下山因子

, double eps_x // 閾值

, double eps_f // 閾值

, void (*f)( double** x, int n) // 帶求解非線性方程組函式

, void (*df)(double** x, int n) // 帶求解非線性方程組的導函式(jacobi矩陣)

)calc_dx( &dx, fx, dfx, lamda, n); // 計算步長

max_f = norm_inf( fx, n );

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

memcpy( fx, x, row_size);

f( &fx, n );

max_f1 = norm_inf( fx, n );

if ( max_f1 < max_f )

else

}else

else

}}end:

free( dx );

free( fx );

free( dfx);

return ret;

}

3、測試

考慮用牛頓下山法求解以下非線性方程組:

求解以上方程的主程式:

#include #include #include #include #include "newton.h"

#define math_e 2.7182818285

#define math_pi 3.1415926536

void f( double** x, int n )

void df( double** x, int n )

int main()

計算結果:

x = 0.500000

y = -0.000000

z = -0.523599

MATLAB牛頓法求解非線性方程組2

牛頓法主程式 clear clc format x0 0 0 迭代初始值 eps 0.00001 定位精度要求 for i 1 10 f double subs fun x0 df double subs dfun x0 得到雅克比矩陣 x x0 f df if abs x x0 eps break...

C語言牛頓迭代法求解非線性方程組

牛頓法 牛頓法是一種線性化方法,其基本思想是將非線性方程f x 0逐步歸結為某種線性方程來求解。設已知方程有近似根 假定 將函式在點展開,有 於是方程可近似地表示為 這是個線性方程,記其根為,則的計算公式 這就是牛頓法。一 演算法及流程 對於非線性方程 在處按照多元函式的泰勒展開,並取線性項得到 其...

N P求解非線性方程組

對於那些看別人部落格,自己卻從來不寫的人,我希望你們也多寫。對於那些只會說別人 你寫的這個別人已經寫過了 的人,請你躝開。用牛頓迭代法 newton raphson 求解非線性方程組 x1 2 10 x1 x2 2 8 0 x1 x2 2 x1 10 x2 8 0 圖1是隨著求解次數的x1與x2值 ...