
#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语言编一个线性插值的小程序,很着急、编写曲线线性,非线性插值程序、什么是插值等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)