请教“马鞍形”的曲线学名叫什么?如何画?帮帮忙,不然要失业啦!

acneyouth 2004-08-10 05:50:22
我用三次样条法、B样条法画出来的总是不太好看,左右不对称。
我的程序要求找出曲线的极值,可是用三次样条法好像不能求极值吧?
这对关系到我的工作,请大家帮帮忙!先行谢过!
...全文
2977 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
acneyouth 2004-08-12
  • 打赏
  • 举报
回复
谢谢雨淋淋,我编译一下试试,完了再请教!
qqhuangshen 2004-08-11
  • 打赏
  • 举报
回复
如果用MATLAB插值后然后自动寻峰,则实现非常简单,但是估计你们老板不让用MATLAB啊
DentistryDoctor 2004-08-11
  • 打赏
  • 举报
回复
我是初中生,没学过高数,所以进来学习学习。
qqhuangshen 2004-08-11
  • 打赏
  • 举报
回复
FOR INSTANCE

float Data[512];//原始数据
float Peakdata[512];//存放峰值点

int nIndex[512];//存放峰值点在原数组中的序号
int nPeakNum=0;//峰值点的个数

float Maxpt[10];//用来存放10个最大的峰值点
float Index[10];//用来存放该10个最大点在最大峰值点数组中的序号

nPeakNum=SearchPeakPt(Data,512,nIndex);

for(i=0;i<nPeakNum;i++)
{
CalData[i]=Data[nIndex[i]];
}
//从峰值中找出10个最大的峰值
SearchMaxPt(CalData,nPeakNum,Maxpt,10,Index);

//这样最大点就存放到Maxpt[10]中了
//而这10个最大值在原数组中的位置可由nIndex[Index[i]]来获得

qqhuangshen 2004-08-11
  • 打赏
  • 举报
回复
我也不知道你说的马鞍线是什么,好像没有听说过马鞍形的“曲线”
不过三次样条插值后把所有采样点和插值点存入一个新的数组date[],之后我给你提供一个曲线自动寻找最大值的代码:希望有所帮助:

具体操作时,先根据搜出所有两侧值都小于该点的凸点,再在这些峰值中找出最大的n(n视你要显示的个数而定)个点(当然还要把该点在原数组中的位置记下

来,便于在谱图中画出这些最大点),实际寻峰效果还可以。

int SearchPeakPt(float *data, int datasize, int *nIndex)
{
//函数功能:寻峰值
//参数说明:data:原始数组指针,datasize:原始数据大小,
//nIndex:记录峰值点在原数组中的位置
//函数返回值:峰值点的个数
int peakdatasize=0;
int nStartIndex=0;
int nStartAgainIndex=0;
int nMidIndex=0;

for(int i=0;i<datasize-1;i++)
{
if(data[i+1]>data[i])
{
nStartIndex=i;
break;
}
}

while(nStartIndex<datasize-20)
{
for(i=nStartIndex;i<datasize-1;i++)
{
if(data[i+1]<data[i])
{
nMidIndex=i;
nIndex[peakdatasize]=i;
peakdatasize++;
break;
}
}

for(i=nMidIndex;i<datasize-1;i++)
{
if(data[i+1]>data[i])
{
nStartIndex=i;
break;
}
}
}
return peakdatasize;
}



BOOL SearchMaxPt(float *data, int datasize, float *datamax, int datamaxsize,int* Index)
{
//此函数功能为搜索最大点
//参数说明:
//data[datasize]为原始数据
//datamax[datamaxsize]为最大点数组,其中通过调节datamaxsize值可以改变要搜索的总点数
//Index[]记录最大点在原数组中的下标
int nStartPos;//保存当前要找最大值的序列的起始下标
float dbMax;//保存当前序列中的最大值元素,实际上为一中间变量
int nMaxPos;//保存当前序列中最大值元素在整个序列中的下标值

//当前要找最大值序列的起始坐标从0开始,到datamaxsize-1,即找出datamaxsize个最大值
for(nStartPos=0;nStartPos<datamaxsize;nStartPos++)
{
dbMax=data[nStartPos];
nMaxPos=nStartPos;
for(int nSearchIndex=nStartPos+1;nSearchIndex<datasize;nSearchIndex++)
{
if(data[nSearchIndex]>dbMax)
{
dbMax=data[nSearchIndex];
nMaxPos=nSearchIndex;
}
}
data[nMaxPos]=data[nStartPos];
data[nStartPos]=dbMax; //dbMax相当于中间变量
Index[nStartPos]=nMaxPos;
}
//将最大值按顺序传入datamax[]数组
for(int i=0;i<datamaxsize;i++)
{
datamax[i]=data[i];
}

return TRUE;

}



acneyouth 2004-08-11
  • 打赏
  • 举报
回复
对了大家说的是曲面,我要的是曲线。
acneyouth 2004-08-11
  • 打赏
  • 举报
回复
详细情况是这样的:
程序要求过实验收集的N个数值(大约是5<N<10)作一条光滑曲线,首先我搞不清楚这个“光滑曲线”究竟是什么线?是大家说的这个曲线吗?
可以肯定的是它应该是对称的,我用三次插样法画的线不对称。
另外实验的目的是画出曲线后,找到曲线的最大值,而用三次插样法画的曲线,最大值总是我输入值的最大值,达不到程序的目的。
alphapaopao 2004-08-11
  • 打赏
  • 举报
回复
qqhuangshen(雨淋淋) 是高手
qqhuangshen 2004-08-11
  • 打赏
  • 举报
回复
其实我已经说了,把插值后的样点加上原来的样点存入一个新的数组,在利用上面的函数进行实现就可以了;在此我用MATLAB给你编了一下:
x=1:12;
y=[5 8 9 15 25 29 31 30 22 25 27 24]; %样点
h=1:0.1:12; %插值的密集点 从1到12每隔0.1插值
t= interp1(x,y,h,'spline'); %用三次样条插值法
figure(1),title('compare image'), xlable('x dimention');ylabel('y dimention')
plot(x,y,'+',h,t,x,y,'r:');
hold on;

figure(2);title('after interp');
xlable('x dimention');ylabel('y dimention')
[maxpoint,maxindex]=max(t);
xindex=h[maxindex];
plot(xindex,maxpoint,'+',h,t,'r'); %在曲线上进行标定
hold on




xindex和maxpoint便是你所需要的点
由于三次样条插值法的C语言实现比较困难,我们一般用C语言都做拉格朗日插值
而借助数学软件明显简单得多
acneyouth 2004-08-11
  • 打赏
  • 举报
回复
曲线象三角函数曲线。
acneyouth 2004-08-11
  • 打赏
  • 举报
回复
谢谢大家,尤其是雨淋淋!不过,我的目的不是在现成的点阵中找到最大值。

比如我有5个任意的点,我必须把它连成一条对称、光滑的曲线,这条曲线肯定有一个峰值,而且只有一个峰值。已知条件就是这5个点,我如何计算这个峰值,如何画出这条曲线?

tyglikelove 2004-08-10
  • 打赏
  • 举报
回复
高数上好象叫“鞍行面”吧?
标准方程:z=(x^2/p-y^2/q)/2
楼上的讲的很详细!看来是个高手哦!
qqhuangshen 2004-08-10
  • 打赏
  • 举报
回复

[xx,yy]=meshgrid(-100,0.1:100);
zz=(x^2/p-y^2/q)/2;
figure;
hold; title('shuangqu projection'),xlabel('x'),ylabel('y'),zlabel('z')
mesh(xx,yy,zz)
hold on;
qqhuangshen 2004-08-10
  • 打赏
  • 举报
回复
马鞍线咱们高数都学过
标准方程是 x^2/p-y^2/q=2z p>0,q>0
这个曲面与平面的界限是 原点相交的直线 y=sqrt(q/p)x y=-sqrt(q/p)x
于XOZ YOZ平面相交都是抛物线

曲面在XOY平面上面的部分,沿着X轴正负方向上升,在XOY下面的部分,沿着Y的正负方向下降
点M(x,y,z)在此轨迹上的充分条件是,存在x^2=2px ,y=0上的一点M0,使得点M在一个以M0为定点且开口,形状,对称轴均与 y^2=-2px,x=0一样的抛物线
x0^2=2pz0 ,y0=0,y^2=-2q(z-z0), x=x0
消去x0,y0,z0得到 x^2/p-y^2/q=2z
椭圆抛物线与他没有对称中心,所以也叫无心二次曲面


小弟最近搞数学建模,整天就是MATLAB,VC荒废了
howtotell 2004-08-10
  • 打赏
  • 举报
回复
双曲线或者双曲面,极值是计算出来的,不是通过你画图看出来的.
qqhuangshen 2004-08-10
  • 打赏
  • 举报
回复
用MATLAB可以吗?
alphapaopao 2004-08-10
  • 打赏
  • 举报
回复
曲线?还是曲面?

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧