利用最小二乘法拟合直线(用VB)在界面上画出图并显示方程

作者&投稿:宰父浦 (若有异议请与网页底部的电邮联系)
VB最小二乘法拟合直线~

稍等好吗?
好了,但愿没有耽误你!代码如下(注意不用任何控件即可):

Private Sub Form_click()
Dim N As Integer, U() As Double, I As Integer
Dim A As Single, B As Single
Form1.Cls
Print "数据:";
N = Val(InputBox("原始数据个数", "输入", 7))
If N <= 1 Then Exit Sub
ReDim U(4, N)
Print "共"; N; "组:"
For I = 1 To N
U(1, I) = Val(InputBox("自变量 X 的值:", "第一组", I))
U(2, I) = Val(InputBox("因变量 Y 的值:", "第一组", I * 5))
U(3, I) = U(1, I) * U(2, I)
U(4, I) = U(1, I) ^ 2
Print "x("; I; ") = "; U(1, I); " y("; I; ") = "; U(2, I)
U(1, 0) = U(1, 0) + U(1, I)
U(2, 0) = U(2, 0) + U(2, I)
U(3, 0) = U(3, 0) + U(3, I)
U(4, 0) = U(4, 0) + U(4, I)
Next I
U(1, 0) = U(1, 0) / N
U(2, 0) = U(2, 0) / N
B = (U(3, 0) - N * U(1, 0) * U(2, 0)) / (U(4, 0) - N * U(1, 0) ^ 2)
A = U(2, 0) - B * U(1, 0)
Print "拟合公式为:"
Print " y = "; A;
If B >= 0 Then Print " + ";
Print B; "x"
End Sub

Private Sub Form_Load()
Form1.AutoRedraw = True
Form1.Caption = "最小二乘法拟合程序"
Print
Print "本程序执行的顺序为:"
Print "1、输入数据数量;"
Print "3、逐个输入各组数据;"
Print "2、输出拟合公式。"
Print
Print "特别说明:本程序不用任何控件!只要把窗口拉的足够大就行了。"
Print
Form1.Print "单击窗体开始..."
End Sub

已经运行过。

'新建窗体,添加text1,command1,picture1
Private Sub Command1_Click()
If Text1.Text = "" Then Exit Sub
Dim x() As Single, y() As Single, cnt As Integer
Dim xmax As Single, xmin As Single, ymax As Single, ymin As Single
Dim p() As String, z() As String
Dim xyh As Single, xh As Single, yh As Single, xph As Single, k As Single, b As Single
p = Split(Text1.Text, "/")
For i = 0 To UBound(p)
If p(i) "" Then
z = Split(p(i), "*")
If UBound(z) = 1 Then
If IsNumeric(z(0)) And IsNumeric(z(1)) Then
If cnt = 0 Then xmax = z(0): xmin = z(0): ymax = z(1): ymin = z(1)
If xmax < z(0) Then xmax = z(0)
If xmin > z(0) Then xmin = z(0)
If ymax < z(1) Then ymax = z(1)
If ymin > z(1) Then ymin = z(1)
xyh = xyh + z(0) * z(1): xh = xh + z(0): yh = yh + z(1): xph = xph + z(0) ^ 2
ReDim Preserve x(cnt), y(cnt)
x(cnt) = z(0): y(cnt) = z(1): cnt = cnt + 1
End If
End If
End If
Next
Picture1.Cls
Picture1.DrawWidth = 1
If xmax = xmin And ymax = ymin Then
MsgBox "单点无法拟合"
ElseIf xmax = xmin Then
Picture1.Scale (xmin * 0.5, ymax + 0.2 * (ymax - ymin))-(xmin * 1.5, ymin - 0.2 * (ymax - ymin))
zuobiaozhou xmin * 0.5, ymax + 0.2 * (ymax - ymin), xmin * 1.5, ymin - 0.2 * (ymax - ymin)
Picture1.Line (xmax, ymax + 0.2 * (ymax - ymin))-(xmax, ymin - 0.2 * (ymax - ymin)), vbBlue
ElseIf ymax = ymin Then
Picture1.Scale (xmin - 0.2 * (xmax - xmin), ymax * 1.5)-(xmax + 0.2 * (xmax - xmin), ymin * 0.5)
zuobiaozhou xmin - 0.2 * (xmax - xmin), ymax * 1.5, xmax + 0.2 * (xmax - xmin), ymin * 0.5
Picture1.Line (xmin - 0.2 * (xmax - xmin), ymax)-(xmax + 0.2 * (xmax - xmin), ymax), vbBlue
Else
Picture1.Scale (xmin - 0.2 * (xmax - xmin), ymax + 0.2 * (ymax - ymin))-(xmax + 0.2 * (xmax - xmin), ymin - 0.2 * (ymax - ymin))
zuobiaozhou xmin - 0.2 * (xmax - xmin), ymax + 0.2 * (ymax - ymin), xmax + 0.2 * (xmax - xmin), ymin - 0.2 * (ymax - ymin)
k = (xyh - (xh * yh) / cnt) / (xph - xh ^ 2 / cnt)
b = yh / cnt - k * xh / cnt
Picture1.Line (xmin - 0.2 * (xmax - xmin), k * (xmin - 0.2 * (xmax - xmin)) + b)-(xmax + 0.2 * (xmax - xmin), k * (xmax + 0.2 * (xmax - xmin)) + b), vbBlue
End If
Picture1.DrawWidth = 5
For i = 0 To cnt - 1
Picture1.PSet (x(i), y(i)), vbRed
Next
Text1.SetFocus
End Sub
Private Sub Form_Activate()
Text1.SetFocus
End Sub
Private Sub Form_Load()
Text1.Text = ""
Text1.ToolTipText = "横纵坐标间以乘号*分隔,各点间以除号/分隔。例如:100*100/200*200"
Command1.Caption = "绘图"
Picture1.AutoRedraw = True
End Sub
Private Sub Text1_KeyPress(KeyAscii As Integer)
If Not (IsNumeric(Chr(KeyAscii)) Or KeyAscii = 8 Or KeyAscii = 42 Or KeyAscii = 45 Or KeyAscii = 46 Or KeyAscii = 47) Then KeyAscii = 0
End Sub
Function zuobiaozhou(ByVal x1 As Single, y1 As Single, x2 As Single, y2 As Single)
For i = x1 + (x2 - x1) / 5 To x2 Step (x2 - x1) / 5
Picture1.Line (i, y2 + 100 * (y1 - y2) / Picture1.Height)-(i, y2)
Picture1.CurrentX = i - 250 * (x2 - x1) / Picture1.Width
Picture1.CurrentY = y2 + 350 * (y1 - y2) / Picture1.Height
Picture1.Print i
Next
For i = y2 + (y1 - y2) / 5 To y1 Step (y1 - y2) / 5
Picture1.Line (x1, i)-(x1 + 100 * (x2 - x1) / Picture1.Width, i)
Picture1.CurrentX = x1 + 150 * (x2 - x1) / Picture1.Width
Picture1.CurrentY = i + 80 * (y1 - y2) / Picture1.Height
Picture1.Print i
Next
End Function

这个是高等数学里的。做实验常用的方法。
最小二乘法原理
  在我们研究两个变量(x, y)之间的相互关系时,通常可以得到一系列成对的数据(x1, y1、x2, y2... xm , ym);将这些数据描绘在x -y直角坐标系中(如图1), 若发现这些点在一条直线附近,可以令这条直线方程如(式1-1)。
  Y计= a0 + a1 X (式1-1)
  其中:a0、a1 是任意实数
  为建立这直线方程就要确定a0和a1,应用《最小二乘法原理》,将实测值Yi与利用(式1-1)计算值(Y计=a0+a1X)的离差(Yi-Y计)的平方和〔∑(Yi - Y计)2〕最小为“优化判据”。
  令: φ = ∑(Yi - Y计)2 (式1-2)
  把(式1-1)代入(式1-2)中得:
  φ = ∑(Yi - a0 - a1 Xi)2 (式1-3)
  当∑(Yi-Y计)平方最小时,可用函数 φ 对a0、a1求偏导数,令这两个偏导数等于零。
  (式1-4)
  (式1-5)
  亦即:
  m a0 + (∑Xi ) a1 = ∑Yi (式1-6)
  (∑Xi ) a0 + (∑Xi2 ) a1 = ∑(Xi, Yi) (式1-7)
  得到的两个关于a0、 a1为未知数的两个方程组,解这两个方程组得出:
  a0 = (∑Yi) / m - a1(∑Xi) / m (式1-8)
  a1 = [n∑Xi Yi - (∑Xi ∑Yi)] / [n∑Xi2 - (∑Xi)2 )] (式1-9)
  这时把a0、a1代入(式1-1)中, 此时的(式1-1)就是我们回归的元线性方程即:数学模型。
  在回归过程中,回归的关联式是不可能全部通过每个回归数据点(x1, y1、 x2, y2...xm,ym),为了判断关联式的好坏,可借助相关系数“R”,统计量“F”,剩余标准偏差“S”进行判断;“R”越趋近于 1 越好;“F”的绝对值越大越好;“S”越趋近于 0 越好。
  R = [∑XiYi - m (∑Xi / m)(∑Yi / m)]/ SQR{[∑Xi2 - m (∑Xi / m)2][∑Yi2 - m (∑Yi / m)2]} (式1-10) *
  在(式1-1)中,m为样本容量,即实验次数;Xi、Yi分别任意一组实验X、Y的数值。微积分应用课题一 最小二乘法
  从前面的学习中, 我们知道最小二乘法可以用来处理一组数据, 可以从一组测定的数据中寻求变量之间的依赖关系, 这种函数关系称为经验公式. 本课题将介绍最小二乘法的精确定义及如何寻求 与 之间近似成线性关系时的经验公式. 假定实验测得变量之间的 个数据 , , …, , 则在 平面上, 可以得到 个点 , 这种图形称为“散点图”, 从图中可以粗略看出这些点大致散落在某直线近旁, 我们认为 与 之间近似为一线性函数, 下面介绍求解步骤.
  考虑函数 , 其中 和 是待定常数. 如果 在一直线上, 可以认为变量之间的关系为 . 但一般说来, 这些点不可能在同一直线上. 记 , 它反映了用直线 来描述 , 时, 计算值 与实际值 产生的偏差. 当然要求偏差越小越好, 但由于 可正可负, 因此不能认为总偏差 时, 函数 就很好地反映了变量之间的关系, 因为此时每个偏差的绝对值可能很大. 为了改进这一缺陷, 就考虑用 来代替 . 但是由于绝对值不易作解析运算, 因此, 进一步用 来度量总偏差. 因偏差的平方和最小可以保证每个偏差都不会很大. 于是问题归结为确定 中的常数 和 , 使 为最小. 用这种方法确定系数 , 的方法称为最小二乘法.

Private Sub Form_click()
Dim N As Integer, U() As Double, I As Integer
Dim A As Single, B As Single
Form1.Cls
Print "数据:";
N = Val(InputBox("原始数据个数", "输入", 7))
If N <= 1 Then Exit Sub
ReDim U(4, N)
Print "共"; N; "组:"
For I = 1 To N
U(1, I) = Val(InputBox("自变量 X 的值:", "第一组", I))
U(2, I) = Val(InputBox("因变量 Y 的值:", "第一组", I * 5))
U(3, I) = U(1, I) * U(2, I)
U(4, I) = U(1, I) ^ 2
Print "x("; I; ") = "; U(1, I); " y("; I; ") = "; U(2, I)
U(1, 0) = U(1, 0) + U(1, I)
U(2, 0) = U(2, 0) + U(2, I)
U(3, 0) = U(3, 0) + U(3, I)
U(4, 0) = U(4, 0) + U(4, I)
Next I
U(1, 0) = U(1, 0) / N
U(2, 0) = U(2, 0) / N
B = (U(3, 0) - N * U(1, 0) * U(2, 0)) / (U(4, 0) - N * U(1, 0) ^ 2)
A = U(2, 0) - B * U(1, 0)
Print "拟合公式为:"
Print " y = "; A;
If B >= 0 Then Print " + ";
Print B; "x"
End Sub

Private Sub Form_Load()
Form1.AutoRedraw = True
Form1.Caption = "最小二乘法拟合程序"
Print
Print "本程序执行的顺序为:"
Print "1、输入数据数量;"
Print "3、逐个输入各组数据;"
Print "2、输出拟合公式。"
Print
Print "特别说明:本程序不用任何控件!只要把窗口拉的足够大就行了。"
Print
Form1.Print "单击窗体开始..."
End Sub

感觉用matlab更加的方便点


急!!!这个题怎样用最小二乘法建立趋势方程,,解释具体点。谢谢
X5=2004,X6=2005,Y1=0.457,Y2=0.502,……Y6=0.713,显然本题中的n=6,现根据上述数据算出X、Y的平均值,再将结果带入公式中计算出a和b的值(i的取值为1,2,3,4,5,6),这样用最小二乘法公式拟合的直线方程y=bx+a就知道了,再令x=2006,就可求出y即为2006年的满意度。

最小二乘法怎么计算?
数学表达:Yi-y^=Yi-a-bXi.总离差不能用n个离差之和来表示,通常是用离差的平方和即(Yi-a-bXi)^2计算。即作为总离差,并使之达到最小,这样回归直线就是所有直线中除去最小值的那一条。这种使“离差平方和最小”的方法,叫做最小二乘法。用最小二乘法求回归直线方程中的a,b有图一和图二...

利用最小二乘法怎么算线性度的问题!高手进!
LINEST 函数可通过使用最小二乘法计算与现有数据最佳拟合的直线,来计算某直线的统计值,然后返回描述此直线的数组。也可以将 LINEST 与其他函数结合使用来计算未知参数中其他类型的线性模型的统计值,包括多项式、对数、指数和幂级数。因为此函数返回数值数组,所以必须以数组公式的形式输入。请按照本文中的...

依照最小二乘法拟合直线回归方程是使()。
依照最小二乘法拟合直线回归方程是使()。A.Σ(y?-??)=最小 B.Σ(y?-??)2=最小 C.Σ(y?-??)=最小 D.Σ(y?-??)2=最小 正确答案:B

如何在Excel中用最小二乘法拟合数据?
1、在excel中输入或打开要进行最小二乘法拟合的数据,如图所示。2、按住“shift”键的同时,用鼠标左键单击以选择数据,如图所示。3、单击菜单栏上的“插入”》“图表”》“散点图”图标,如图所示。4、弹出下拉列表,单击“散点图”》“仅带数据标记的散点图”图标,如图所示。5、此时,在窗口中间...

最小二乘法回归直线方程公式是什么?
回归直线方程公式详解如下:回归直线的求法通常是最小二乘法:离差作为表示xi对应的回归直线纵坐标y与观察值yi的差,其几何意义可用点与其在回归直线竖直方向上的投影间的距离来描述。

线性代数的理解和应用(9.8) “最小二乘”方法及其实施步骤 ——直线...
设定一个假设的函数模型,如线性模型y = ax + b。 计算每个数据点与模型预测值之间的误差平方和。 调整模型参数(a和b),使得误差平方和最小化。这通常通过求解一个线性方程组或使用梯度下降等优化算法来实现。 得到的最优参数(a和b)即为最小二乘法拟合的直线斜率和截距。通过最小二乘法...

用Excel如何进行最小二乘法的线性拟合?
常数为零 如果要强制回归线通过原点,请选中此复选框。 输出区域 在此输入对输出表左上角单元格的引用。汇总输出表至少需要有七列的宽度,包含的内容有 anova 表、系数、y 估计值的标准误差、2 值、观察值个数,以及系数的标准误差。 残差 如果需要以残差输出表的形式查看残差,请选中此复选框。标...

【MATLAB】如何用最小二乘法拟合直线?
y=[2.1 3.9 6.1 8.2 10.3 12];nh1=polyfit(x,y,2);%这里是二次拟合,你也可以先画出大概图形 估计它是几次曲线然后再判断是1 2 还是3.。。等。m=1:.5:6;%m是根据散点x来定的。nh2=polyval(nh1,m);plot(x,y,'+',m,nh2)这是拟合图形 用最小二乘法求值就是用最小二乘...

用最小二乘法作直线拟合
k=2.82 r=0.999

满洲里市19575791286: VB最小二乘法拟合直线
比时茵栀: 稍等好吗? 好了,但愿没有耽误你!代码如下(注意不用任何控件即可): Private Sub Form_click() Dim N As Integer, U() As Double, I As Integer Dim A As Single, B As Single Form1.Cls Print "数据:"; N = Val(InputBox("原始数据个数"...

满洲里市19575791286: 利用最小二乘法拟合直线(用VB)在界面上画出图并显示方程
比时茵栀: Private Sub Form_click() Dim N As Integer, U() As Double, I As Integer Dim A As Single, B As Single Form1.Cls Print "数据:"; N = Val(InputBox("原始数据个数", "输入", 7)) If N <= 1 Then Exit Sub ReDim U(4, N) Print "共"; N; ...

满洲里市19575791286: 如何用VB编写一求最小2乘法的程序 要求,实验数据用表格表示,用不同的颜色表示校准直线与拟合直线 -
比时茵栀: 设拟合直线y=a*x+b 实验数据(x0,y0),(x1,y1),...,(xi,yi) 目标函数f=(a*x0+b-y0)^2+(a*x1+b-y1)^2+...+(a*xi+b-yi)^2 若使f最小,令f'(a=)0且f'(b)=0 即:2*x0*(a*x0+b-y0)+2*x1*(a*x1+b-y1)+...+2*xi*(a*xi+b-yi)=02*(a*x0+b-y0)+2*(a*x1+b-y1)+...+2*(a*xi+b-yi)=0 联立求解a,b 程序就自己编吧啊

满洲里市19575791286: 用VB实现用最小二乘法处理实验数据程序. -
比时茵栀: template class TreeNode{ public:T data;int index;int active;TreeNode & operator=(TreeNode & treenode){this->data=treenode.data;this->index=treenode.index;this->active=treenode.active;return *this;} };

满洲里市19575791286: VB直线最小二乘法拟合 -
比时茵栀: '新建窗体,添加text1,command1,picture1 Private Sub Command1_Click() If Text1.Text = "" Then Exit Sub Dim x() As Single, y() As Single, cnt As Integer Dim xmax As Single, xmin As Single, ymax As Single, ymin As Single Dim p() As String, ...

满洲里市19575791286: 在vb中已经计算出直线函数,如何做出直线图像 -
比时茵栀: Private Sub Command1_Click() Dim X!, Y!, i! Picture1.Scale (-20, 3)-(300, -2) Picture1.Line (-3, 0)-(300, 0) 'X Picture1.Line (0, 3)-(0, -3) 'Y For i = 0 To 300 Step 25 'X轴坐标 Picture1.Line (i, 0.1)-(i, 0) Picture1.Print i Next i For i = 0.1 To 3 Step 0.1 ...

满洲里市19575791286: 大神帮帮忙 是关于最小二乘法的VB程序
比时茵栀: Option Explicit Private Type POINTAPI x As Double y As Double End Type Private Sub Form_Load() Dim p(0 To 4) As POINTAPI Dim a As Double, b As Double Dim x As Double, y As Double Dim sumxy As Double, sumx2 As Double Dim i As ...

满洲里市19575791286: matlab中用最小二乘法拟合直线 -
比时茵栀: 用polyfit函数,(用来多项式拟合的,是用最小二乘法)举个例子x=[90 91 92 93 94 95 96]; z=[70 122 144 152 174 196 202]; a=polyfit(x,z,1)结果:a =1.0e+03 *0.0205 -1.7551 1表示1次多项式(一次时就是直线,适用于你的情况) a是多项式的系数向量,是从高次项往低次项排的, 如果想运用结果,比如想知道当x=97时z等于多少 那么有两种方法, 直接用系数>> a(1)*97+a(2) ans =233.4286 或者用polyval函数 >> polyval(a,97) ans =233.4286

满洲里市19575791286: 曲线拟合 VB -
比时茵栀: 创建一个窗体,在窗体上加3个按钮Command1,Command2,Command3,一个PictureBox控件名为Picture1, 在picture1中加一个Label控件,名为Label, 然后把下面代码复制进去即可: Dim Xindex() As Single Dim Yindex() As Single Dim num...

满洲里市19575791286: 【MATLAB】如何用最小二乘法拟合直线? -
比时茵栀: x=[1 2 3 4 5 6]; y=[2.1 3.9 6.1 8.2 10.3 12]; nh1=polyfit(x,y,2);%这里是二次拟合,你也可以先画出大概图形 估计它是几次曲线然后再判断是1 2 还是3...等. m=1:.5:6;%m是根据散点x来定的. nh2=polyval(nh1,m); plot(x,y,'+',m,nh2)这是拟合图...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网