代码之家  ›  专栏  ›  技术社区  ›  Michael O' Driscoll

如何将直线拟合到可变曲线并确定x截距

  •  1
  • Michael O' Driscoll  · 技术社区  · 7 年前

    我试图找出如何将直线编码到曲线的直线部分,曲线应该看起来像指数,单击链接打开图像:

    Straight line to Curve and determining the x-intercept

    这是代码,我只是以指数为例

    `

        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
            Dim s As String
            Dim xl As New Excel.Application
            Dim wb As Excel.Workbook
            Dim ws As Excel.Worksheet
            wb = xl.Workbooks.Add   'create new workbook
            ws = wb.Worksheets(1)   'select sheet 1
            ws.Activate()
            Dim Currents() As Double
            Dim PhotodiodeValues() As Double
            Dim AppliedCurrent As Double
            'AppliedCurrent = SerialPort1.ReadLine
            AppliedCurrent = 0
            If AppliedCurrent >= 0 And AppliedCurrent < 0.1 Then
                Dim j As Integer = 1
                For i As Double = 0 To 5 Step 0.5
                    ReDim Preserve Currents(j)
                    ReDim Preserve PhotodiodeValues(j)
                    MsgBox(i)
                    MsgBox("LDI " & CType(i, String))
                    s = ("LDI " & CType(i, String))
                    AppliedCurrent = i
                    If AppliedCurrent >= i And AppliedCurrent < (i + 0.1) Then
                        Currents(j) = CType(i, Double)
                        Label1.Text = Currents(j)
                        PhotodiodeValues(j) = CType(Math.E ^ (i), Double)
                        ws.Cells(j, 1) = Currents(j)
                        ws.Cells(j, 2) = PhotodiodeValues(j)
                    Else
                        System.Threading.Thread.Sleep(1000)
                    End If
                    j = j + 1
                Next
            Else
                System.Threading.Thread.Sleep(1000)
            End If
            sfd1.ShowDialog()       'get file name
            wb.SaveAs(sfd1.FileName) 'save data to file
            wb.Close()
            xl = Nothing  'dispose of excel
            ScatterGraph1.PlotXY(Currents, PhotodiodeValues)
            'SerialPort1.Close()
        End Sub
    End Class`
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   Patrick87    7 年前

    首先,我将解释我的思维过程。如果我有误解,请让我知道,我会更新我的答案。曲线y=e^x的斜率dy/dx是dy/dx=e^x,是x对所有实x的单调递增函数。函数从来没有一个点成为线性,虽然它有一条水平渐近线(y=0),但没有垂直渐近线。

    我认为你想要的是在斜率首先大于某个截止值m*的点上的切线方程。在这一点之后,就你的意图和目的而言,y=e^x的图形“也可能”是一条直线。

    因此,我们必须首先求解方程m*=dy/dx=e^x,对于m*出现的x。e ^ x的范围都是正实数,并且e ^ x是单调递增的,因此任何正实数m*都将具有唯一解x*。实际上,x*=ln(m*)。我们的切线将通过点(x*,e^x*)并具有斜率m*。回想一下,m*=e^x*,因此点是(ln(m*),m*),斜率是m*。

    用一个点和斜率,我们可以算出一条直线的方程。我们得到从给定点到任何其他点的斜率必须是m*;所以,(y-y*)/(x-x*)=m*。重新排列,(y-y*)=m*(x-x*),y=m x-m x*+y*,最后y=m x+(y -m x )=米 x+(m -m ln(m) )). 因此,Y截距为(m*-m) ln(m) )). 我们可以通过设置y=0并求解X:0=m来获得X截距 x+(m -m ln(m) )),米 x=m ln(m*)-m*,x=ln(m*)-1。

    总之:

    • 与y=e^x相切且斜率为m*的直线方程为y=m x+(m -m ln(m) )).
    • 这条线的Y截距为(m*-m) ln(m) )).
    • 这条线的X截距是ln(m*)-1

    如果曲线在编译时已知,我建议对导数和任何渐近线的闭合形式解析解进行硬编码。如果函数直到运行时才知道,则可以使用多种方法在数值上近似给定点的导数。直观地说,当d接近零时,将导数定义为(f(x+d)-f(x))/d的极限,可以用于找到导数(可能)存在的导数的近似值。对于性能良好的分析函数,除非在特殊情况下,否则通常是安全的。

    如果函数的导数是单调非递减的,如本例所示,则可以使用近似(如上所述)结合类似于二进制搜索的方法,找到函数斜率满足或超过某个截止点的点(如果有)。从一个值开始,例如x=0,然后通过一些乘法递增因子增加或减少x,直到通过目标。现在,根据可以找到目标的x值的界限,检查范围的中间部分,然后递归地检查左半部分或右半部分,直到找到合适的好x*。