社区
数据结构与算法
帖子详情
100分,求思路!由点得到拟合球
jianxinlee
2003-12-03 02:49:53
现有离散空间点若干,如何得到拟合意义上的球,即要求算法给出球心坐标和半径!
...全文
277
8
打赏
收藏
100分,求思路!由点得到拟合球
现有离散空间点若干,如何得到拟合意义上的球,即要求算法给出球心坐标和半径!
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
8 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
jianxinlee
2003-12-04
打赏
举报
回复
强人,呵呵,谢了,这就结贴!
saint001
2003-12-04
打赏
举报
回复
刚才一段时间上不去论坛
d:\CircleFit.txt中的数据
20
2.8708 1.3399 3.2936
1.3901 0.9456 4.7586
-0.2118 1.4578 4.4892
-0.7987 1.6279 3.5585
2.3814 0.9131 3.9640
2.4616 0.8509 2.2743
-0.7898 2.6383 3.6532
2.5070 3.3155 3.3500
-0.6203 0.9506 3.3615
-0.8986 2.4616 2.6251
2.5346 3.2571 2.5281
2.5465 1.8771 4.4302
3.0246 2.2083 3.3029
3.0213 2.4154 2.6920
0.1899 2.2169 4.8677
2.6968 1.4048 2.1883
-0.7191 3.0063 2.8426
2.7501 1.5074 2.1484
2.8091 2.7637 2.3159
-0.9991 2.1089 3.0588
数据是用matlab产生的球心为1,2,3,半径为2的球面上的随机点,并有随机误差(0.1以内),所以拟合出来球心近似是[1,2,3],半径应该近似为2
程序输出结果是
1.039589 2.051142 3.058152 2.009236
前三项为球心坐标,后一项为半径
saint001
2003-12-04
打赏
举报
回复
前些天编写的最小二乘拟合的程序,这几天就用了好几次,从d:\CircleFit.txt中读取数据
#include "math.h"
#include "stdio.h"
#define ABS(x) (x)>0?(x):-(x)
#define SWAP(a,b) {temp=(a);(a)=(b);(b)=temp;}
void solve(double **a,double *b,double *x,int n)
{
int i,j,k,ik;
double mik,temp;
for(k=0;k<n;k++)
{
mik=-1;
for(i=k;i<n;i++)
if(ABS(a[i][k])>mik)
{
mik=ABS(a[i][k]);
ik=i;
}
for(j=k;j<n;j++)
SWAP(a[ik][j],a[k][j]);
SWAP(b[k],b[ik]);
b[k]/=a[k][k];
for(i=n-1;i>=k;i--)
a[k][i]/=a[k][k];
for(i=k+1;i<n;i++)
{
b[i]-=a[i][k]*b[k];
for(j=n-1;j>=k;j--)
a[i][j]-=a[i][k]*a[k][j];
}
}
for(i=n-1;i>=0;i--)
{
x[i]=b[i];
for(j=i+1;j<n;j++)
x[i]-=a[i][j]*x[j];
}
}
void linear(double **x,double *y,double *beta,int n,int p)
{
double **a,*b;
int i,j,k;
a=new double*[p];
for(i=0;i<p;i++)
a[i]=new double[p];
for(i=0;i<p;i++)
for(j=0;j<p;j++)
{
a[i][j]=0;
for(k=0;k<n;k++)
a[i][j]+=x[k][i]*x[k][j];
}
b=new double[p];
for(i=0;i<p;i++)
{
b[i]=0;
for(j=0;j<n;j++)
b[i]+=x[j][i]*y[j];
}
solve(a,b,beta,p);
for(i=0;i<p;i++)
delete a[i];
delete a,b;
}
void main()
{
int i,n,p=4;
double x0,y0,z0,r;
double **x,*y,beta[4];
FILE *fp=fopen("d:\\CircleFit.txt","r");
fscanf(fp,"%d",&n);
x=new double*[n];
y=new double[n];
for(i=0;i<n;i++)
{
x[i]=new double[4];
fscanf(fp,"%lf",x[i]);
fscanf(fp,"%lf",x[i]+1);
fscanf(fp,"%lf",x[i]+2);
x[i][3]=1;
y[i]=-x[i][0]*x[i][0]-x[i][1]*x[i][1]-x[i][2]*x[i][2];
}
fclose(fp);
linear(x,y,beta,n,p);
x0=-beta[0]/2;
y0=-beta[1]/2;
z0=-beta[2]/2;
r=sqrt(x0*x0+y0*y0+z0*z0-beta[3]);
printf("%f\t%f\t%f\t%f\t\n",x0,y0,z0,r);
}
saint001
2003-12-04
打赏
举报
回复
很简单的问题
昨天把它想复杂了
直接对x^2+y^2+z^2+ax+by+cz+d=0拟合就行了
拟合的四个系数是a,b,c,d,最小二乘法
本来很简单,可是昨天局限在了把球心和半径作为自变量上
有了a,b,c,d球心坐标和半径也就知道了
jianxinlee
2003-12-03
打赏
举报
回复
saint001,应该你是对的,我的描述有问题!
但是这个Ri怎么构造呢?球心半径都是待求量
saint001
2003-12-03
打赏
举报
回复
问题不是你说的对R求和,使和最小,如果是这个意思,平均值就差不多了(对R^2求和最小)
而是要求Ri的偏差(方差)比较小
saint001
2003-12-03
打赏
举报
回复
如果进行最小二乘拟合,就是求这些点的坐标平均值
jianxinlee
2003-12-03
打赏
举报
回复
关于提到“拟合意义”,是我自己感觉这个问题就像常见的直线拟合或者多项式拟合。
当然一个很显然的思路是:(x-x0)^2 +(y-y0)^2 +(z-z0)^2 = R^2, 然后对R求和S,构造S达到最小时的(x0, y0, z0)。但是这个构造过程如何进行呢?
或者那位牛牛有更好的办法,感激不尽!
利用线性最小二乘将一个椭圆_
球
体_抛物面_超二乘用于数据matlab实现.rar
本文将详细介绍如何在Matlab环境下使用线性最小二乘法来
拟合
椭圆、
球
体、抛物面以及超二乘的数学模型。线性最小二乘法是一种数学优化技术,旨在通过最小化误差的平方和来寻找数据的最佳函数匹配。这种方法广泛应用于...
快手2019秋招笔试试题-算法A试卷.docx
- **解题
思路
**:这是一个典型的几何
分
布问题,平均期望可以通过计算
得到
。 - **答案解析**:设X表示每个家庭的孩子数量,由于每个家庭都会至少生一个孩子,并且生男孩的概率为0.5,所以期望E(X) = 1 + (1/0.5) = 2...
桌上冰
球
机器人对目标碰撞轨迹研究.pdf
将通过仿真获得的实验数据,使用MATLAB进行数据
拟合
处理,从而
得到
一个作为冰
球
碰撞过程的碰撞函数关系,并以此作为预测算法。数据
拟合
是研究者利用数学方法去找到一组数据的最佳函数匹配,可以用来预测未知数据点的...
2010年全国研究生数学建模竞赛优秀论文选-10407002.pdf
通过对小型试验数据的
拟合
,可以获得不同形状参数下的轨迹方程系数,从而使得模型更加通用和实用。 ##### 形状参数化处理 为了简化复杂形状物体的计算,作者采用了体积等效和截面等效的方法,将它们等效为
球
形物体...
偏最小二乘在可靠度
分
析中的应用
响应面法的核心思想是通过近似构造一个具有明确表达式的多项式来代替隐式的结构功能函数,即利用较少的样本点来
拟合
出一个简单的响应面,以近似真实的极限状态曲面。然而,在应用最小二乘法
拟合
样本数据回归模型时,...
数据结构与算法
33,028
社区成员
35,337
社区内容
发帖
与我相关
我的任务
数据结构与算法
数据结构与算法相关内容讨论专区
复制链接
扫一扫
分享
社区描述
数据结构与算法相关内容讨论专区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章