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

How to fit straight line to variable curve and determining the x-intercept

I'm trying to figure out how to code a straight line to the straight part of a curve, the curve should look something like the exponential, click the link to open the image:

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`

首先,我将解释我的思考过程。如果我误解了,请告诉我,我会更新我的答案。曲线y = e^x的斜率dy/dx为dy/dx = e^x,x对所有实数x的单调递增函数。永远不会有函数变为线性的点,虽然它有水平渐近线 (y = 0),但没有垂直渐近线。

我认为你想要的是在斜率首先变得大于某个截止值 m* 的点处截取的切线方程。在那之后,y = e^x "might as well" 的图形将成为您的意图和目的的直线。

所以,我们必须先求解方程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 = mx - mx* + y*,最后 y = m x + (y - mx) = mx + (m - mln(m))。因此 Y 轴截距为 (m* - mln(m))。我们可以通过设置 y = 0 并求解 x 来获得 X 截距: 0 = mx + (m - mln(m) ), mx = mln(m*) - m*, x = ln(m*) - 1.

总结:

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

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

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