c语言三维插值函数图像 c++绘图函数

高分悬赏 求三维数据点C语言插值计算程序

问题补充,因字数限制,挪到这

创新互联专注于当雄网站建设服务及定制,我们拥有丰富的企业做网站经验。 热诚为您提供当雄营销型网站建设,当雄网站制作、当雄网页设计、当雄网站官网定制、小程序开发服务,打造当雄网络公司原创品牌,更为您提供当雄网站排名全网营销落地服务。

1.拉格朗日插值简介:

对给定的n个插值节点x1,x2,…,xn,及其对应的函数值y1=f(x1), y2=f(x2),…, yn=f(xn);使用拉格朗日插值公式,计算在x点处的对应的函数值f(x);

2.一维拉格朗日插值c语言程序:

Int lagrange(x0, y0, n, x, y)

Float xo[], yo[], x;

Int n;

Float *y

{

Int i, j;

Float p;

*y=0;

If (n1)

{

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

{

P=1;

For(j=1;jn;j++)

{

If(i!=J)

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

}

*y=*y+p*y0[i];

Return(0);

}

Else

Return(-1);

}

3.例题。已知函数如下表所示,求x=0.472处的函数值:

X 0.46 0.47 0.48 0.49

Y 0.484655 0.4903745 0.502750 0.511668

计算这个问题的c语言程序如下:

#minclude stdio

#includeMnath.h

Main()

{

Float x0[4]={ 0.46, 0.47,0.48,0.49};

Float y0[4]={ 0.484655 ,0.4903745 ,0.502750 ,0.511668};

Float x, y;

Int n, rtn;

N=4;

X=0.472;

Rth=lagrange(x0,y0,n,x,y);

If(rtn=0)

{

Prinf(“Y(0.472)=:%f\n”,y);

}

Else

{

Prinf(“n must be larger than 1.\n”);

}

}

计算结果:Y(0.472)=:0.495553

4.问题补充

我的问题与上面的例子类似,计算三维空间一点(x,y,z)对应的函数值(Vx,Vy,Vz).不同的是自变量(point_coordinate.txt)为三维空间散乱点(不是正方体的顶点),因变量(point_data.txt)为矢量(向量 )。插值算法比较多,常数法,拉格朗日插值,埃特金插值,三阶样条插值等。最简单的就是常数法,查找离目标点(x,y,z)距离最近的已知自变量(Xi,Yi,Zi),把该点的函数值赋给目标点做函数值,求高手帮忙写写。

用C语言编写一个线性插值程序

#include stdio.h

double Lerp(double x0,double y0,double x1,double y1,double x)

{

double dy = y1 - y0;

if(dy == 0){

printf("除0错误!\n");

return 0;

}

return x * (x1 - x0) / dy;

}

int main()

{

double x0,x1,y1,y0,x,y;

printf("Inptu x0 y0 x1 y1 x:");

scanf("%lf %lf %lf %lf %lf",x0,y0,x1,y1,x);

y = Lerp(x0,y0,x1,y1,x);

printf("y = %lf\n",y);

return 0;

}

如何用C语言实现三维

最简单的做法是在结构体里存函数指针,然后初始化结构体的时候将函数的地址赋值给它。

复杂一点的,就得按照c++的多态原理,用虚函数表(其实就是能记录函数名对应的函数地址就好)记录每种结构体的成员函数地址,然后每个结构体里多存一个虚函数表的地址。。。然后调用函数的时候查到函数地址强转成函数类型然后调用。。。这个可以自己研究一下c++的虚函数表机制。

求c语言写的双三次插值函数

void

SPL(int

n,

double

*x,

double

*y,

int

ni,

double

*xi,

double

*yi);

是你所要。

已知

n

个点

x,y;

x

必须已按顺序排好。要插值

ni

点,横坐标

xi[],

输出

yi[]。

程序里用double

型,保证计算精度。

SPL调用现成的程序。

现成的程序很多。端点处理方法不同,结果会有不同。想同matlab比较,你需

尝试

调用

spline()函数

时,令

end1

1,

slope1

的值,令

end2

1

slope2

的值。

#include

stdio.h

#include

math.h

int

spline

(int

n,

int

end1,

int

end2,

double

slope1,

double

slope2,

double

x[],

double

y[],

double

b[],

double

c[],

double

d[],

int

*iflag)

{

int

nm1,

ib,

i,

ascend;

double

t;

nm1

=

n

-

1;

*iflag

=

0;

if

(n

2)

{

/*

no

possible

interpolation

*/

*iflag

=

1;

goto

LeaveSpline;

}

ascend

=

1;

for

(i

=

1;

i

n;

++i)

if

(x[i]

=

x[i-1])

ascend

=

0;

if

(!ascend)

{

*iflag

=

2;

goto

LeaveSpline;

}

if

(n

=

3)

{

d[0]

=

x[1]

-

x[0];

c[1]

=

(y[1]

-

y[0])

/

d[0];

for

(i

=

1;

i

nm1;

++i)

{

d[i]

=

x[i+1]

-

x[i];

b[i]

=

2.0

*

(d[i-1]

+

d[i]);

c[i+1]

=

(y[i+1]

-

y[i])

/

d[i];

c[i]

=

c[i+1]

-

c[i];

}

/*

----

Default

End

conditions

*/

b[0]

=

-d[0];

b[nm1]

=

-d[n-2];

c[0]

=

0.0;

c[nm1]

=

0.0;

if

(n

!=

3)

{

c[0]

=

c[2]

/

(x[3]

-

x[1])

-

c[1]

/

(x[2]

-

x[0]);

c[nm1]

=

c[n-2]

/

(x[nm1]

-

x[n-3])

-

c[n-3]

/

(x[n-2]

-

x[n-4]);

c[0]

=

c[0]

*

d[0]

*

d[0]

/

(x[3]

-

x[0]);

c[nm1]

=

-c[nm1]

*

d[n-2]

*

d[n-2]

/

(x[nm1]

-

x[n-4]);

}

/*

Alternative

end

conditions

--

known

slopes

*/

if

(end1

==

1)

{

b[0]

=

2.0

*

(x[1]

-

x[0]);

c[0]

=

(y[1]

-

y[0])

/

(x[1]

-

x[0])

-

slope1;

}

if

(end2

==

1)

{

b[nm1]

=

2.0

*

(x[nm1]

-

x[n-2]);

c[nm1]

=

slope2

-

(y[nm1]

-

y[n-2])

/

(x[nm1]

-

x[n-2]);

}

/*

Forward

elimination

*/

for

(i

=

1;

i

n;

++i)

{

t

=

d[i-1]

/

b[i-1];

b[i]

=

b[i]

-

t

*

d[i-1];

c[i]

=

c[i]

-

t

*

c[i-1];

}

/*

Back

substitution

*/

c[nm1]

=

c[nm1]

/

b[nm1];

for

(ib

=

0;

ib

nm1;

++ib)

{

i

=

n

-

ib

-

2;

c[i]

=

(c[i]

-

d[i]

*

c[i+1])

/

b[i];

}

b[nm1]

=

(y[nm1]

-

y[n-2])

/

d[n-2]

+

d[n-2]

*

(c[n-2]

+

2.0

*

c[nm1]);

for

(i

=

0;

i

nm1;

++i)

{

b[i]

=

(y[i+1]

-

y[i])

/

d[i]

-

d[i]

*

(c[i+1]

+

2.0

*

c[i]);

d[i]

=

(c[i+1]

-

c[i])

/

d[i];

c[i]

=

3.0

*

c[i];

}

c[nm1]

=

3.0

*

c[nm1];

d[nm1]

=

d[n-2];

}

else

{

b[0]

=

(y[1]

-

y[0])

/

(x[1]

-

x[0]);

c[0]

=

0.0;

d[0]

=

0.0;

b[1]

=

b[0];

c[1]

=

0.0;

d[1]

=

0.0;

}

LeaveSpline:

return

0;

}

double

seval

(int

n,

double

u,

double

x[],

double

y[],

double

b[],

double

c[],

double

d[],

int

*last)

{

int

i,

j,

k;

double

w;

i

=

*last;

if

(i

=

n-1)

i

=

0;

if

(i

0)

i

=

0;

if

((x[i]

u)

||

(x[i+1]

u))

{

i

=

0;

j

=

n;

do

{

k

=

(i

+

j)

/

2;

if

(u

x[k])

j

=

k;

if

(u

=

x[k])

i

=

k;

}

while

(j

i+1);

}

*last

=

i;

w

=

u

-

x[i];

w

=

y[i]

+

w

*

(b[i]

+

w

*

(c[i]

+

w

*

d[i]));

return

(w);

}

void

SPL(int

n,

double

*x,

double

*y,

int

ni,

double

*xi,

double

*yi)

{

double

*b,

*c,

*d;

int

iflag,last,i;

b

=

(double

*)

malloc(sizeof(double)

*

n);

c

=

(double

*)malloc(sizeof(double)

*

n);

d

=

(double

*)malloc(sizeof(double)

*

n);

if

(!d)

{

printf("no

enough

memory

for

b,c,d\n");}

else

{

spline

(n,0,0,0,0,x,y,b,c,d,iflag);

if

(iflag==0)

printf("I

got

coef

b,c,d

now\n");

else

printf("x

not

in

order

or

other

error\n");

for

(i=0;ini;i++)

yi[i]

=

seval(ni,xi[i],x,y,b,c,d,last);

free(b);free(c);free(d);

};

}

main(){

double

x[6]={0.,1.,2.,3.,4.,5};

double

y[6]={0.,0.5,2.0,1.6,0.5,0.0};

double

u[8]={0.5,1,1.5,2,2.5,3,3.5,4};

double

s[8];

int

i;

SPL(6,

x,y,

8,

u,

s);

for

(i=0;i8;i++)

printf("%lf

%lf

\n",u[i],s[i]);

return

0;

}

如何用c语言画函数图像

用GDI绘图吧,比较简单。绘图的思想是让x以固定的值在区间内持续增长,比如x=0.1,0.2,0.3.....,以计算出的y值来确定y坐标。用线连接所有的点就行了。MoveTo(),LineTo()函数你用得着,具体情况请自行查看MSDN。


本文标题:c语言三维插值函数图像 c++绘图函数
URL链接:http://ybzwz.com/article/hgepip.html