用C语言编一个线性插值的小程序,很着急

用C语言编一个线性插值的小程序,很着急,第1张

#include<stdioh>

#include<stdlibh>

#include<iostreamh>

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次插值):";//获得插值次数

cin>>n;

if(n<=count-1)// 插值次数不得大于count-1次

break;

else

system("cls");

}

//初始化t,y,yt。

float t=10;

float y=d[0]y;

float yt=00;

//计算y值

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

{

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

yt=f(0,j)t;

//cout<<f(0,j)<<endl;

y=y+yt;

}

return y;

}

float lagrange(float x,int count)

{

float y=00;

for(int k=0;k<count;k++)//这儿默认为count-1次插值

{

float p=10;//初始化p

for(int j=0;j<count;j++)

{//计算p的值

if(k==j)continue;//判断是否为同一个数

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

}

y=y+pd[k]y;//求和

}

return y;//返回y的值

}

void main()

{

float x,y;

int count;

while(1)

{

cout<<"请输入x[i],y[i]的组数,不得超过20组:";//要求用户输入数据组数

cin>>count;

if(count<=20)

break;//检查输入的是否合法

system("cls");

}

//获得各组数据

for(int i=0;i<count;i++)

{

cout<<"请输入第"<<i+1<<"组x的值:";

cin>>d[i]x;

cout<<"请输入第"<<i+1<<"组y的值:";

cin>>d[i]y;

system("cls");

}

cout<<"请输入x的值:";//获得变量x的值

cin>>x;

while(1)

{

int choice=3;

cout<<"请您选择使用哪种插值法计算:"<<endl;

cout<<" (0):退出"<<endl;

cout<<" (1):Lagrange"<<endl;

cout<<" (2):Newton"<<endl;

cout<<"输入你的选择:";

cin>>choice;//取得用户的选择项

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;

}

cout<<x<<" , "<<y<<endl;//输出最终结果

}

%以下是lagrange插值程序

function [f,f0] = Language(x,y,x0)

syms t;

if(length(x) == length(y))

n = length(x);

else

disp('x和y的维数不相等!');

return;

end

f = 00;

for(i = 1:n)

l = y(i);

for(j = 1:i-1)

l = l(t-x(j))/(x(i)-x(j));

end;

for(j = i+1:n)

l = l(t-x(j))/(x(i)-x(j));

end;

f = f + l;

simplify(f);

end

f0=subs(f,'t',x0);

%另一个M文件

clc;

clear;

x=[02 03 04 045 05 055 06 065 07 075 08 085 09 095 10 105 11 115 12 125 13 135 14 145];

y=[38 50 65 74 85 92 98 108 116 125 138 145 156 168 185 208 244 292 355 405 620 850 1200 1620];

plot(x,y,'r')

[f,f0] = Language(x,y,053) %为要计算的插值点,如053

“插值”最初是电脑的术语,现在引用到数码图像的处理上。即图像放大时,像素也相应地增加,增加的过程就是“插值”程序自动选择信息较好的像素作为增加的像素,而并非只使用临近的像素,所以在放大图像时,图像看上去会比较平滑、干净。不过需要说明的是插值并不能增加图像信息。通俗地讲插值的效果实际就是给一杯香浓的咖啡兑了一些白开水。

★ 常见的插值方法及其原理

1 最临近像素插值:图像出现了马赛克和锯齿等明显走样的原因。不过最临近插值法的优点就是速度快。

2 线性插值(Linear):线性插值速度稍微要慢一点,但效果要好不少。所以线性插值是个不错的折中办法。

3 其他插值方法:立方插值,样条插值等等,它们的目的是试图让插值的曲线显得更平滑,为了达到这个目的,它们不得不利用到周围若干范围内的点,不过计算量显然要比前两种大许多。

在以上的基础上,有的软件还发展了更复杂的改进的插值方式譬如S-SPline、Turbo Photo等。它们的目的就是使边缘的表现更完美。

★ 评断插值结果的好坏

第一个标准:走样现象的轻重。放大图像的时候,要看边缘是否产生了锯齿,缩小图像的时候,看看是否有干扰条纹,边缘是否平顺。第二个标准:边缘是否清晰?同样贴两个例子,左边是差的算法,右边是好的算法(如图1)。第三个标准:过渡带的层次感细节感怎么样?贴两个例子,左边是差的算法,右边是好的算法(如图2)。

插值的今生

★ 是否有必要

购买插值数码相机

看了上面的原理介绍,相信大家应该已经了解了插值实际上就是一种技术,它能给我们的照片信息提供一些美化和提高,但是这样的技术提升是有限制的,使用320×240分辨率的相机是不可能代替百万像素的数码相机的,虽然我们可以使用Photoshop将分辨率为320×240的照片放大成1280×960,但它的照片真实信息仍然只有320×240。其余增加的可都是“白开水”。

matlab中使用插值函数

插值函数(the function of interpolation )

interp1

调用函数的格式(Syntax)

yi = interp1(x,Y,xi)

yi = interp1(Y,xi)

yi = interp1(x,Y,xi,method)

yi = interp1(x,Y,xi,method,'extrap')

yi = interp1(x,Y,xi,method,extrapval)

pp = interp1(x,Y,method,'pp')

调用格式说明(Description)

yi = interp1(x,Y,xi) 返回矢量X和Y决定的根据输入的节点xi时对应的y的值矢量Y是矢量X的一个函数映射

如果Y是一个矩阵,那么插值结果是一个对应的矩阵

[===================================================

yi = interp1(x,Y,xi) returns vector yi containing elements corresponding to the elements of xi and determined by interpolation within vectors x and Y The vector x specifies the points at which the data Y is given If Y is a matrix, then the interpolation is performed for each column of Y and yi is length(xi)-by-size(Y,2)

===================================================]

yi = interp1(x,Y,xi,method)插值中可以使用的方法: 插值方法 说明 nearest 临近的两点插值 linear 线性插值(默认) spline 三次样条插值 pchip 分段三次Hermite插值多项式插值 cubic (作用于pchip相同) v5cubic 用matlab5版本中断三次样条插值 [====================================================

yi = interp1(x,Y,xi,method) interpolates using alternative methods:

methodDescription

nearestNearest neighbor interpolation

linearLinear interpolation (default)

splinesplineCubic spline interpolation

pchipPiecewise cubic Hermite interpolation

cubic(Same as 'pchip')

v5cubicCubic interpolation used in MATLAB 5

======================================================]

简单程序示例

>>x=[00 01 0195 03 0401 05];

>>y=[039849 039695 039142 038138 036812 035206];

>>plot(x,y);

>>T=interp1(x,y,25,'linear') %线性插值

(返回结果T=03862)

>> T=interp1(x,y,25,'nearest') % 两点插值

(返回结果T=03814)

>>T=interp1(x,y,25,'spline')  % 三次样条插值

(返回结果T =03867)

>>T=interp1(x,y,25,'cubic') %三次插值

(返回结果T =03867)

插值”最初是电脑的术语,后来引用到数码图像上来。图像放大时,像素也相应地增加,但这些增加的像素从何而来?“插值”程序会自动选择信息较好的像素作为增加的像素,而并非只使用临近的像素,所以在放大图像时,图像看上去会比较平滑、干净――但必须注意的是插值并不能增加图像信息。例如:一张照片中,人因为距离比较远,在照片上只有一个白点,但当图像插值放大时,这个人还是白点,只是比以前稍微大了些。

在市场上我们所常见的摄像头像素一般都是30万或者35万像素的,而有的商家往往会说自己的产品可以达到插值120万 像素,这又是怎么一回事呢?其实,这些摄像头是使用了软件插值算出来的,简单的说就是将640X480的拉大到1024X7 68,然后再利用软件计算分辨率点之间的色彩区别,把中间拉大的部分填入软件计算的颜色。这样做虽然输出的大了,但是图 像的质量并没有真正的提高,甚至还有可能严重失真。

#include<iostreamh>

#include<iomaniph>

#include<mathh>

void main()

{

float a[37],b[37];

cout<<" "<<"度数"<<" "<<"sin(x)值"<<" "<<"一阶导值"<<" "<<"二阶导值"<<endl;

for(int i=0;i<37;i++)

cout<<setw(11)<<setprecision(3)

<<10i

<<setw(11)<<setprecision(3)

<<sin(i314/180)

<<setw(11)<<setprecision(3)

<<cos(i314/180)

<<setw(11)<<setprecision(3)

<<-sin(i314/180)

<<endl;

cout<<"一个周期内的积分值:0"<<endl;

}

用拉格朗日插值做y=1/(1+x^2);本来就有很大的偏差,你的插值函数没写错

这是我做过的一个y=1/(1+25x^2)的图像 ,这里取得是11点,你的应该是5点的吧。你的做完是这种么。这样没错,插值法不适合太多点,想做多点的用的是分段插值。你应该是在学计算方法的课程吧,后边就会讲的。

以上就是关于用C语言编一个线性插值的小程序,很着急全部的内容,包括:用C语言编一个线性插值的小程序,很着急、编写曲线线性,非线性插值程序、什么是插值等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/10078531.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-05
下一篇2023-05-05

发表评论

登录后才能评论

评论列表(0条)

    保存