如何将直线拟合到可变曲线并确定 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*。
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*。