❶ 數值微分法用通俗的語言解釋一下它的實現方法
就是求導了!
作差,求商,求極限唄
參考:http://ke..com/view/295773.htm
數學分析裡面有的
根據函數在一些離散點的函數值,推算它在某點的導數或高階導數的近似值的方法。通常用差商代替微商,或者用一個能夠近似代替該函數的較簡單的可微函數(如多項式或樣條函數等)的相應導數作為能求導數的近似值。例如一些常用的數值微分公式(如兩點公式、三點公式等)就是在等距步長情形下用插值多項式的導數作為近似值的。此外,還可以採用待定系數法建立各階導數的數值微分公式,並且用外推技術來提高所求近似值的精確度。當函數可微性不太好時,利用樣條插值進行數值微分要比多項式插值更適宜。如果離散點上的數據有不容忽視的隨機誤差,應該用曲線擬合代替函數插值,然後用擬合曲線的導數作為所求導數的近似值,這種做法可以起到減少隨機誤差的作用。數值微分公式還是微分方程數值解法的重要依據。
另請參考:http://www.fjtu.com.cn/fjnu/courseware/0329/course/_source/web/lesson/char7/j1.htm
下面是一個包含了簡單差商的C代碼,是我寫給別人的,椐說有點錯誤,但我因為這不影響你理解差商
0 0.5 1.0 1.5 2.0 2.5
0.84147 0.85770 0.89924 0.94898 0.98777 0.99955
要求:
1.根據上表,計算差商表,並列印出來.
2.列印出Newton插值多項式.
3.計算f(1.673),用3次Newton插值多項式.
4.計算f(0.618),用5次Newton插值多項式.
根據以上要求,請用C或C++編寫個程序.
#include<math.h>
#include<stdio.h>
#include<stdlib.h>
typedef struct data
{float x;
float y;}Data;
void scan(Data* a)
{float x,y;
scanf("%f%f",&x,&y);
(*a).x=x;
(*a).y=y;}
float f(Data *d,int s,int t)
{
if(t==s+1) return (d[t].y-d[s].y)/(d[t].x-d[s].x);
else return (f(d,s+1,t)-f(d,s,t-1))/(d[t].x-d[s].x);
}
float Newton(Data *d,float x)
{float t=1.0;
float y=d[0].y;
float yt=0;
int j,n;
while(1){
printf("\ninput n:");
scanf("%d",&n);
if(n<20) break;
else system("cls");}
for(j=1;j<=n;j++){
t=(x-d[j-1].x)*t;
yt=f(d,0,j)*t;
printf("%f\n",f(d,0,j));
y=y+yt;}
return y;
}
main(){
Data d[20];
Data *p=d;
int i,n;
float y,x;
printf("\ninput arrey ( <20 ):" );
scanf("%d",&n);
for(i=0;i<n;i++) scan(p+i);
printf("\ninput x:");
scanf("%f",&x);
y=Newton(d,x);
printf("\nji guowei:%f",y);
}