OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2429|回复: 9

现有3个点,求斜率的算法?求助

[复制链接]

32

主题

236

帖子

0

精华

高级会员

Rank: 4

积分
993
金钱
993
注册时间
2017-8-11
在线时间
137 小时
发表于 2020-6-9 15:20:18 | 显示全部楼层 |阅读模式
5金钱
有3个点,分别是(x1,y1)(x2,y2)(x3,y3)
这三个点原则上是在同一条斜线上的,当因为做工、误差、环境等外界因素。这3个点会在标准斜线上浮动
各位有思路吗?
如何求出  x/y 的值

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

32

主题

236

帖子

0

精华

高级会员

Rank: 4

积分
993
金钱
993
注册时间
2017-8-11
在线时间
137 小时
 楼主| 发表于 2020-6-9 15:31:16 | 显示全部楼层
能不能用3个斜率求平均值得出??
A=(x2-x1)/(y2-y1)
B=(x3-x2)/(y3-y2)
C=(x3-x1)/(y3-y1)

(A+B+C)/3 ????
回复

使用道具 举报

22

主题

2251

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4480
金钱
4480
注册时间
2013-4-22
在线时间
337 小时
发表于 2020-6-9 15:35:15 | 显示全部楼层
精度要求不高可以
回复

使用道具 举报

32

主题

236

帖子

0

精华

高级会员

Rank: 4

积分
993
金钱
993
注册时间
2017-8-11
在线时间
137 小时
 楼主| 发表于 2020-6-9 16:23:17 | 显示全部楼层
笨鸟想飞 发表于 2020-6-9 15:31
能不能用3个斜率求平均值得出??
A=(x2-x1)/(y2-y1)
B=(x3-x2)/(y3-y2)

这种算法的话,不够完整,要注意处理3个情况,
1、x相同,y不同的情况,这个时候只能相加求平均
2、x为0时候
3、有两个数值x相同,y接近
回复

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
发表于 2020-6-10 09:26:09 | 显示全部楼层
本帖最后由 nashui_sx 于 2020-6-10 09:27 编辑
  1. /*
  2. 本实验根据数组x[], y[]列出的一组数据,用最小二乘法求它的拟合曲线。
  3. P(x) = 0.000034x^3-0.005216x^2+0.263399x^1+0.017839x
  4. matlab:
  5. clc
  6. clear all
  7. close all
  8. format long
  9. x=[0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55];
  10. y=[0, 1.27, 2.16, 2.86, 3.44, 3.87, 4.15, 4.37, 4.51, 4.58, 4.02, 4.64];
  11. p=polyfit(x,y,3)
  12. x1=min(x):0.1:max(x);
  13. y1=polyval(p,x1);
  14. plot(x,y,'*r',x1,y1,'-b')
  15. %0.000034364154364  -0.005215562215562   0.263398527398528   0.017838827838825
  16. */
  17. #include <stdio.h>
  18. #include <math.h>

  19. #define max_num  12//数据个数
  20. #define rank_nun  3//几次拟合

  21. void lsqe(double *x,double *y,int num,double *b)
  22. {
  23.         double atemp[2 * (rank_nun + 1)] = {0}, a[rank_nun + 1][rank_nun + 1];
  24.         int i, j, k,n;

  25.     for(i = 0; i < num; i++)
  26.         {
  27.         atemp[1] += x[i];
  28.         atemp[2] += pow(x[i], 2);
  29.         atemp[3] += pow(x[i], 3);
  30.         atemp[4] += pow(x[i], 4);
  31.         atemp[5] += pow(x[i], 5);
  32.         atemp[6] += pow(x[i], 6);
  33.         b[0]     += y[i];
  34.         b[1]     += x[i] * y[i];
  35.         b[2]     += pow(x[i], 2) * y[i];
  36.         b[3]     += pow(x[i], 3) * y[i];
  37.         
  38.         if(rank_nun==1)
  39.                 {
  40.                         b[2]=0;
  41.                         b[3]=0;
  42.                 }
  43.                 if(rank_nun==2)
  44.                 {
  45.                         b[3]=0;
  46.                 }
  47.     }

  48.     atemp[0] = num;

  49.     for(i = 0; i < rank_nun + 1; i++)//构建线性方程组系数矩阵,b[]不变
  50.         {  
  51.         k = i;
  52.         for(j = 0; j < rank_nun + 1; j++)  a[i][j] = atemp[k++];
  53.     }

  54.     //以下为高斯列主元消去法解线性方程组
  55.     for(k = 0; k < rank_nun + 1 - 1; k++)//n - 1列
  56.         {  
  57.         int column = k;
  58.         double mainelement = a[k][k];

  59.         for(i = k; i < rank_nun + 1; i++)//找主元素
  60.                 {  
  61.             if(fabs(a[i][k]) > mainelement)
  62.                         {
  63.                 mainelement = fabs(a[i][k]);
  64.                 column = i;
  65.             }
  66.         }
  67.         for(j = k; j < rank_nun + 1; j++)//交换两行
  68.                 {  
  69.             double atemp = a[k][j];
  70.             a[k][j] = a[column][j];
  71.             a[column][j] = atemp;
  72.         }
  73.         double btemp = b[k];
  74.         b[k] = b[column];
  75.         b[column] = btemp;

  76.         for(i = k + 1; i < rank_nun + 1; i++) //消元过程
  77.                 {
  78.             double Mik = a[i][k] / a[k][k];
  79.             for(j = k; j < rank_nun + 1; j++)  a[i][j] -= Mik * a[k][j];
  80.             b[i] -= Mik * b[k];
  81.         }
  82.     }

  83.     b[rank_nun + 1 - 1] /= a[rank_nun + 1 - 1][rank_nun + 1 - 1];  //回代过程
  84.     for(i = rank_nun + 1 - 2; i >= 0; i--)
  85.         {
  86.         double sum = 0;
  87.         for(j = i + 1; j < rank_nun + 1; j++)  sum += a[i][j] * b[j];
  88.         b[i] = (b[i] - sum) / a[i][i];
  89.     }
  90. }
  91. int main(){
  92.     double x[max_num] = {0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55};
  93.     double y[max_num] = {0, 1.27, 2.16, 2.86, 3.44, 3.87, 4.15, 4.37, 4.51, 4.58, 4.02, 4.64};
  94.    
  95.     double b[rank_nun + 1] = {0};
  96.          
  97.     //高斯列主元消去法结束
  98.     lsqe(x,y,max_num,b);               
  99.     printf("P(x) = %fx^3%+fx^2%+fx^1%+fx\n\n", b[3], b[2], b[1], b[0]);

  100.     return 0;
  101. }
复制代码
回复

使用道具 举报

5

主题

356

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4672
金钱
4672
注册时间
2019-4-30
在线时间
904 小时
发表于 2020-6-10 11:33:22 | 显示全部楼层
可以用最小二乘法
回复

使用道具 举报

1

主题

48

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
336
金钱
336
注册时间
2018-1-3
在线时间
98 小时
发表于 2020-6-10 11:58:55 | 显示全部楼层
这个数学老师应该教过,你用浮点变量,代替A,B,C,就好了,如果数值很大,那就把变量浮点化,再缩小个100倍在运算,我就是这么办的,自己运算,填写数据自己标定
回复

使用道具 举报

4

主题

346

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3657
金钱
3657
注册时间
2016-2-21
在线时间
542 小时
发表于 2020-6-10 13:23:33 | 显示全部楼层
因为你预设三个点是在同一个直线上,所以可以直接上最简单的最小二乘法
回复

使用道具 举报

32

主题

236

帖子

0

精华

高级会员

Rank: 4

积分
993
金钱
993
注册时间
2017-8-11
在线时间
137 小时
 楼主| 发表于 2020-6-12 09:32:25 | 显示全部楼层

#define rank_nun  3//几次拟合
这里的拟合次数,因为我的数据都是正整数,就取了5个点,
假设只想得到y=ax+b;,#define rank_nun  1  ???
回复

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
发表于 2020-6-12 19:08:36 | 显示全部楼层
笨鸟想飞 发表于 2020-6-12 09:32
#define rank_nun  3//几次拟合
这里的拟合次数,因为我的数据都是正整数,就取了5个点,
假设只想得到 ...

恩,,,,,,,,,,,,,,,
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-12 18:04

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表