1、演算法描述
(1)符號說明與基本假設
對於非線性方程組:
引入向量:
可將(1)式改寫為
通常考慮方程(2)只有唯一解的情形。
(2)牛頓下山演算法
引入下山因子λ
,產生一下計算格式:
下山因子λ
一般依次取1、1/2、1/4、1/8、……
其中
計算步驟為:
2、c語言實現
newton.h標頭檔案:
newton.c檔案#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
3、測試#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;
}
考慮用牛頓下山法求解以下非線性方程組:
求解以上方程的主程式:
計算結果:#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值 ...