拉格朗日插值法例題c語言,拉格朗日插值公式c語言編程

本文目錄一覽:

用C語言實現拉格朗日插值、牛頓插值、等距結點插值算法

#includestdio.h

#includestdlib.h

#includeiostream.h

typedef struct data

{

float x;

float y;

}Data;//變量x和函數值y的結構

Data d[20];//最多二十組數據

float f(int s,int t)//牛頓插值法,用以返回插商

{

if(t==s+1)

return (d[t].y-d[s].y)/(d[t].x-d[s].x);

else

return (f(s+1,t)-f(s,t-1))/(d[t].x-d[s].x);

}

float Newton(float x,int count)

{

int n;

while(1)

{

cout”請輸入n值(即n次插值):”;//獲得插值次數

cinn;

if(n=count-1)// 插值次數不得大於count-1次

break;

else

system(“cls”);

}

//初始化t,y,yt。

float t=1.0;

float y=d[0].y;

float yt=0.0;

//計算y值

for(int j=1;j=n;j++)

{

t=(x-d[j-1].x)*t;

yt=f(0,j)*t;

//coutf(0,j)endl;

y=y+yt;

}

return y;

}

float lagrange(float x,int count)

{

float y=0.0;

for(int k=0;kcount;k++)//這兒默認為count-1次插值

{

float p=1.0;//初始化p

for(int j=0;jcount;j++)

{//計算p的值

if(k==j)continue;//判斷是否為同一個數

p=p*(x-d[j].x)/(d[k].x-d[j].x);

}

y=y+p*d[k].y;//求和

}

return y;//返回y的值

}

void main()

{

float x,y;

int count;

while(1)

{

cout”請輸入x[i],y[i]的組數,不得超過20組:”;//要求用戶輸入數據組數

cincount;

if(count=20)

break;//檢查輸入的是否合法

system(“cls”);

}

//獲得各組數據

for(int i=0;icount;i++)

{

cout”請輸入第”i+1″組x的值:”;

cind[i].x;

cout”請輸入第”i+1″組y的值:”;

cind[i].y;

system(“cls”);

}

cout”請輸入x的值:”;//獲得變量x的值

cinx;

while(1)

{

int choice=3;

cout”請您選擇使用哪種插值法計算:”endl;

cout” (0):退出”endl;

cout” (1):Lagrange”endl;

cout” (2):Newton”endl;

cout”輸入你的選擇:”;

cinchoice;//取得用戶的選擇項

if(choice==2)

{

cout”你選擇了牛頓插值計算方法,其結果為:”;

y=Newton(x,count);break;//調用相應的處理函數

}

if(choice==1)

{

cout”你選擇了拉格朗日插值計算方法,其結果為:”;

y=lagrange(x,count);break;//調用相應的處理函數

}

if(choice==0)

break;

system(“cls”);

cout”輸入錯誤!!!!”endl;

}

coutx” , “yendl;//輸出最終結果

}

C語言實現拉格朗日插值法的問題

下面是我所寫的拉格朗日C語言實現的程序,經運行正確

#includestdio.h

int main()

{

float x,y;

float a[3]={100,121,144};

float b[3]={10,11,12};

int i,j,k=0;

float t;

y=0;

printf(“請輸入x的值:”);

scanf(“%f”,x);

for(k=0;k3;k++)

{

t=1;

for(j=0;j=2;j++)

if(j!=k)

{

t=((x-a[j])/(a[k]-a[j]))*t;

}

y=y+t*b[k];

}

printf(“y=%f\n”,y);

}

關於拉格朗日插值的編程問題,要用c語言的。

#include stdio.h

#include stdlib.h

#include malloc.h

doubleLAG(int,double *,double *,double);

voidmain()

{

intn;

double *x,*y,t,lag;

t = 0.15;

n = 6;

x = (double*)calloc(n,sizeof(double));

if(x == NULL)

{

printf(“內存分配失敗\n”);

exit(1);

}

y = (double*)calloc(n,sizeof(double));

if(y == NULL)

{

printf(“內存分配失敗\n”);

exit(1);

}

x[0] = 0;

x[1] = 0.1;

x[2] = 0.195;

x[3] = 0.3;

x[4] = 0.401;

x[5] = 0.5;

y[0] = 0.39894;

y[1] = 0.39695;

y[2] = 0.39142;

y[3] = 0.38138;

y[4] = 0.36812;

y[5] = 0.35206;

lag = LAG(n,x,y,t);

printf(“拉各朗日插值後得到的結果是:\n”);

printf(“f(%.2f)=%e\n”,t,lag);

free(x);

free(y);

}

doubleLAG(n,x,y,t)

intn;

double *x;

double *y;

doublet;

{

inti,j;

doublep,s;

s = 0;

for(i=0;in-1;i++)

{

p = 1;

for(j=0;jn-1;j++)

if(i!=j)

p*=(t-x[j])/(x[i]-x[j]);

s+=p*y[i];

}

return (s);

}

曲線擬合:

#include stdio.h

#include stdlib.h

#include malloc.h

#include math.h

Smooth(double *,double *,double *,int,int,

double *,double *,double *);

voidmain()

{

inti,n,m;

double *x,*y,*a,dt1,dt2,dt3,b;

n = 20;

m = 6;

b = 0;

/*分別為x,y,a分配存貯空間*/

x = (double *)calloc(n,sizeof(double));

if(x == NULL)

{

printf(“內存分配失敗\n”);

exit (0);

}

y = (double *)calloc(n,sizeof(double));

if(y == NULL)

{

printf(“內存分配失敗\n”);

exit (0);

}

a = (double *)calloc(n,sizeof(double));

if(a == NULL)

{

printf(“內存分配失敗\n”);

exit (0);

}

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

{

x[i-1]=b+(i-1)*0.1;

/*每隔0.1取一個點,這樣連續取n個點*/

y[i-1]=x[i-1]-exp(-x[i-1]);

/*計算x[i-1]點對應的y值作為擬合已知值*/

}

Smooth(x,y,a,n,m,dt1,dt2,dt3); /*調用擬合函數*/

for(i=1;i=m;i++)

printf(“a[%d] = %.10f\n”,(i-1),a[i-1]);

printf(“擬合多項式與數據點偏差的平方和為:\n”);

printf(“%.10e\n”,dt1);

printf(“擬合多項式與數據點偏差的絕對值之和為:\n”);

printf(“%.10e\n”,dt2);

printf(“擬合多項式與數據點偏差的絕對值最大值為:\n”);

printf(“%.10e\n”,dt3);

free(x); /*釋放存儲空間*/

free(y); /*釋放存儲空間*/

free(a); /*釋放存儲空間*/

}

Smooth(x,y,a,n,m,dt1,dt2,dt3 )

double *x; /*實型一維數組,輸入參數,存放節點的xi值*/

double *y; /*實型一維數組,輸入參數,存放節點的yi值*/

double *a; /*雙精度實型一維數組,長度為m。返回m一1次擬合多項式的m個係數*/

intn; /*整型變量,輸入參數,給定數據點的個數*/

intm; /*整型變量,輸入參數,擬合多項式的項數*/

double *dt1; /*實型變量,輸出參數,擬合多項式與數據點偏差的平方和*/

double *dt2; /*實型變量,輸出參數,擬合多項式與數據點偏差的絕對值之和*/

double *dt3; /*實型變量,輸出參數,擬合多項式與數據點偏差的絕對值最大值*/

{

inti,j,k;

double *s,*t,*b,z,d1,p,c,d2,g,q,dt;

/*分別為s,t,b分配存貯空間*/

s = (double *)calloc(n,sizeof(double));

if(s == NULL)

{

printf(“內存分配失敗\n”);

exit (0);

}

t = (double *)calloc(n,sizeof(double));

if(t == NULL)

{

printf(“內存分配失敗\n”);

exit (0);

}

b = (double *)calloc(n,sizeof(double));

if(b == NULL)

{

printf(“內存分配失敗\n”);

exit (0);

}

z = 0;

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

z=z+x[i-1]/n; /*z為各個x的平均值*/

b[0]=1;

d1=n;

p=0;

c=0;

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

{

p=p+x[i-1]-z;

c=c+y[i-1];

}

c=c/d1;

p=p/d1;

a[0]=c*b[0];

if(m1)

{

t[1]=1;

t[0]=-p;

d2=0;

c=0;

g=0;

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

{

q=x[i-1]-z-p;

d2=d2+q*q;

c=y[i-1]*q+c;

g=(x[i-1]-z)*q*q+g;

}

c=c/d2;

p=g/d2;

q=d2/d1;

d1=d2;

a[1]=c*t[1];

a[0]=c*t[0]+a[0];

}

for(j=3;j=m;j++)

{

s[j-1]=t[j-2];

s[j-2]=-p*t[j-2]+t[j-3];

if(j=4)

for(k=j-2;k=2;k–)

s[k-1]=-p*t[k-1]+t[k-2]-q*b[k-1];

s[0]=-p*t[0]-q*b[0];

d2=0;

c=0;

g=0;

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

{

q=s[j-1];

for(k=j-1;k=1;k–)

q=q*(x[i-1]-z)+s[k-1];

d2=d2+q*q;

c=y[i-1]*q+c;

g=(x[i-1]-z)*q*q+g;

}

c=c/d2;

p=g/d2;

q=d2/d1;

d1=d2;

a[j-1]=c*s[j-1];

t[j-1]=s[j-1];

for(k=j-1;k=1;k–)

{

a[k-1]=c*s[k-1]+a[k-1];

b[k-1]=t[k-1];

t[k-1]=s[k-1];

}

}

*dt1=0;

*dt2=0;

*dt3=0;

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

{

q=a[m-1];

for(k=m-1;k=1;k–)

q=q*(x[i-1]-z)+a[k-1];

dt=q-y[i-1];

if(fabs(dt)*dt3)

*dt3=fabs(dt);

*dt1=*dt1+dt*dt;

*dt2=*dt2+fabs(dt);

}

/*釋放存儲空間*/

free(s);

free(t);

free(b);

return(1);

}

拉格朗日插值法用C語言表示

我的程序是牛頓插值和拉格朗日插值合起來,你自己看下,用的是C++

#include iostream

#include iomanip

#include stdlib.h

using namespace std;

#define N 100

void lagrange()

{

int n,k,m,q=1;

float x[N],y[N],xx,yyy1,yyy2,yy1,yy2,yy3;

cout”請輸入X的個數:”;

cinn;

for(k=0;k=n-1;k++)

{

cout”請輸入X”k”的值:”;

cinx[k];

cout”請輸入Y”k”的值:”;

ciny[k];

}

system(“cls”);

cout”則Xi與Yi表格如下:”endl;

cout”Xi”” “;for(k=0;k=n-1;k++)coutsetiosflags(ios::left)setw(10)x[k];

coutendl;

cout”Yi”” “;for(k=0;k=n-1;k++)coutsetiosflags(ios::left)setw(10)y[k];

coutendl;

while(q)

{

cout”請輸入所求x的值:”;

cinxx;

while(xxx[k-1]||xxx[0])

{

cout”輸入錯誤,請重新輸入:”;

cinxx;

}

for(k=0;k=n-1;k++)

{

if(xxx[k])

{

m=k-1;

k=n-1;

}

}

yyy1=y[m]*((xx-x[m+1])/(x[m]-x[m+1]))+y[m+1]*((xx-x[m])/(x[m+1]-x[m]));

cout”則拉格朗日分段線性插值為:”yyy1endl;

for(k=0;k=n-1;k++)

{

if(xxx[k])

{

m=k-1;

k=n-1;

}

}

if((xx-x[m])(x[m+1]-xx))m=m+1;

else m=m;

yy1=y[m-1]*((xx-x[m])*(xx-x[m+1]))/((x[m-1]-x[m])*(x[m-1]-x[m+1]));

yy2=y[m]*((xx-x[m-1])*(xx-x[m+1]))/((x[m]-x[m-1])*(x[m]-x[m+1]));

yy3=y[m+1]*((xx-x[m-1])*(xx-x[m]))/((x[m+1]-x[m-1])*(x[m+1]-x[m]));

yyy2=yy1+yy2+yy3;

cout”則拉格朗日分段二次插值為:”yyy2endl;

cout”是否輸入其餘要求x的值[是(1),否(0)]:”;

cinq;

}

system(“cls”);

}

void main()

{

lagrange();

}

拉格朗日差值多項式的c語言

function =lagrange(x1,y1,xx)

%本程序為Lagrange1插值,其中x1,y1

%為插值節點和節點上的函數值,輸出為插值點xx的函數值,

%xx可以是向量。

syms x

n=length(x1);

for i=1:n

t=x1;t(i)=[];L(i)=prod((x-t)./(x1(i)-t));% L向量用來存放插值基函數

end

u=sum(L.*y1);

p=simplify(u) % p是簡化後的Lagrange插值函數(字符串)

=subs(p,x,xx);

clf

plot(x1,y1,’ro’,xx,,’*’)

拉格朗日插值用c語言怎麼編程?各位高手幫幫忙啦

#includestdio.h

#includestring.h

#define N 100

typedef struct tag{

double x;

double y;

}POINT;

void main()

{

int i,j,n;

double x,temp,Ln=0;

POINT pt[N];

printf(“請輸入你要輸入點的個數,,1=n=%d:\n”,N);

printf(“n=”);

scanf(“%d”,n);

printf(“\n”);

printf(“\n請輸入對應的點數\n”);

for(i=0;in;i++)

scanf(“%lf,%lf”,pt[i].x,pt[i].y);

printf(“\n”);

printf(“輸入插值點x的值:\n”);

scanf(“%lf”,x);

printf(“\n”);

for(i=0;in;i++)

{

for(j=0,temp=1;jn;j++)

{

if(j!=i)

temp=temp*(x-pt[j].x)/(pt[i].x-pt[j].x);

}

Ln=Ln+temp*pt[i].y;

}

printf(“輸出:\nLn(%lf)=%lf\n”,x,Ln);

}

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/241435.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-12 12:37
下一篇 2024-12-12 12:37

相關推薦

  • AES加密解密算法的C語言實現

    AES(Advanced Encryption Standard)是一種對稱加密算法,可用於對數據進行加密和解密。在本篇文章中,我們將介紹C語言中如何實現AES算法,並對實現過程進…

    編程 2025-04-29
  • 學習Python對學習C語言有幫助嗎?

    Python和C語言是兩種非常受歡迎的編程語言,在程序開發中都扮演着非常重要的角色。那麼,學習Python對學習C語言有幫助嗎?答案是肯定的。在本文中,我們將從多個角度探討Pyth…

    編程 2025-04-29
  • Python被稱為膠水語言

    Python作為一種跨平台的解釋性高級語言,最大的特點是被稱為”膠水語言”。 一、簡單易學 Python的語法簡單易學,更加人性化,這使得它成為了初學者的入…

    編程 2025-04-29
  • OpenJudge答案1.6的C語言實現

    本文將從多個方面詳細闡述OpenJudge答案1.6在C語言中的實現方法,幫助初學者更好地學習和理解。 一、需求概述 OpenJudge答案1.6的要求是,輸入兩個整數a和b,輸出…

    編程 2025-04-29
  • Python按位運算符和C語言

    本文將從多個方面詳細闡述Python按位運算符和C語言的相關內容,並給出相應的代碼示例。 一、概述 Python是一種動態的、面向對象的編程語言,其按位運算符是用於按位操作的運算符…

    編程 2025-04-29
  • 枚舉法例題及解題思路

    本文將從例題和解題思路兩個方面闡述枚舉法,幫助讀者更好地理解和掌握該算法。 一、基本概念 枚舉法,英文名為Brute Force,也叫暴力枚舉法,是一種計算機算法,它通過窮舉所有可…

    編程 2025-04-29
  • Python語言由荷蘭人為中心的全能編程開發工程師

    Python語言是一種高級語言,很多編程開發工程師都喜歡使用Python語言進行開發。Python語言的創始人是荷蘭人Guido van Rossum,他在1989年聖誕節期間開始…

    編程 2025-04-28
  • Python語言設計基礎第2版PDF

    Python語言設計基礎第2版PDF是一本介紹Python編程語言的經典教材。本篇文章將從多個方面對該教材進行詳細的闡述和介紹。 一、基礎知識 本教材中介紹了Python編程語言的…

    編程 2025-04-28
  • Python語言實現人名最多數統計

    本文將從幾個方面詳細介紹Python語言實現人名最多數統計的方法和應用。 一、Python實現人名最多數統計的基礎 1、首先,我們需要了解Python語言的一些基礎知識,如列表、字…

    編程 2025-04-28
  • Python作為中心語言,在編程中取代C語言的優勢和挑戰

    Python一直以其簡單易懂的語法和高效的編碼環境而著名。然而,它最近的發展趨勢表明Python的使用範圍已經從腳本語言擴展到了從Web應用到機器學習等廣泛的開發領域。與此同時,C…

    編程 2025-04-28

發表回復

登錄後才能評論