MathLib

Es gibt 45 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Die Ableitung einer Funktion f an der Stelle x ist ja gleich der Steigung der Funktion f an der Stelle x. Also f'(x) = m(f(x)). Die Steigung könntest du ohne die Ableitung mit Steigungsdreiecken mit einem Algorithmus annähern. Je kleiner du sie wählst, desto genaurer wird die Ableitungsfunktion, aber natürlich nie so exakt wie die Ableitung mit dem Grenzwert gegen 0.

    So könntest du die erste Ableitung annähern, die zweite Ableitung, die dritte usw. und bräuchtest keine Ableitungsregeln verwenden.

    VB.NET-Quellcode

    1. Public Function f_1(ByVal x As Double) As Double
    2. Return x ^ 2
    3. End Function
    4. Public Function f_2(ByVal dx As Double, ByVal x As Integer) As Double
    5. Dim m As Double = (f_1(x + dx) - f_1(x)) / dx
    6. Return m
    7. End Function


    Bei f_1 steht die Grundfunktion, also 0. Ableitung. Die musst du parsen.
    f_2, also f'(x), die 1. Ableitung, lässt sich dann wie in dem Code berechnen. Je kleiner dx ist, desto genaurer ist die Ableitung an der Stelle x. Z.B. bei f(x) = x^2 und x = 4, gibt die Ableitung f'(4) = 9 bei dx = 1, f'(4) = 8,098 bei dx = 0.1, f'(4) = 8,0098 bei dx = 0.01 etc.
    Wie du die dritte Ableitung annäherst, sollte klar sein.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Thilo87“ ()

    In diesem Stil hab' ich mir das vorgestellt:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public MustInherit Class Mapping
    2. Implements IEquatable(Of Mapping)
    3. Public MustOverride Function Apply(ByVal arguments As IDictionary(Of String, Mapping)) As Mapping
    4. Public MustOverride Function Differentiate(ByVal variable As String) As Mapping
    5. Public MustOverride Overloads Sub ToString(ByVal builder As System.Text.StringBuilder)
    6. Public MustOverride Overloads Function Equals(ByVal other As Mapping) As Boolean Implements System.IEquatable(Of Mapping).Equals
    7. Public MustOverride Overrides Function GetHashCode() As Integer
    8. Public Overrides Function Equals(ByVal obj As Object) As Boolean
    9. Return obj IsNot Nothing AndAlso TypeOf obj Is Mapping AndAlso Equals(DirectCast(obj, Mapping))
    10. End Function
    11. Public Overridable ReadOnly Property IsValue As Boolean
    12. Get
    13. Return False
    14. End Get
    15. End Property
    16. Public Overrides Function ToString() As String
    17. Dim sb As New System.Text.StringBuilder()
    18. ToString(sb)
    19. Return sb.ToString()
    20. End Function
    21. Public Shared Widening Operator CType(ByVal value As Double) As Mapping
    22. Return New Constant(value)
    23. End Operator
    24. End Class
    25. Public Class Constant
    26. Inherits Mapping
    27. Public Shared ReadOnly Zero As Constant = New Constant(0)
    28. Private _value As Double
    29. Public Sub New(ByVal value As Double)
    30. _value = value
    31. End Sub
    32. Public ReadOnly Property Value As Double
    33. Get
    34. Return _value
    35. End Get
    36. End Property
    37. Public Overrides Function Differentiate(ByVal variable As String) As Mapping
    38. Return Zero
    39. End Function
    40. Public Overloads Overrides Function Equals(ByVal other As Mapping) As Boolean
    41. Return TypeOf other Is Constant AndAlso DirectCast(other, Constant).Value = Value
    42. End Function
    43. Public Overrides Function GetHashCode() As Integer
    44. Return Value.GetHashCode()
    45. End Function
    46. Public Overloads Overrides Sub ToString(ByVal builder As System.Text.StringBuilder)
    47. builder.Append(Value)
    48. End Sub
    49. Public Overrides ReadOnly Property IsValue As Boolean
    50. Get
    51. Return True
    52. End Get
    53. End Property
    54. Public Overrides Function Apply(ByVal arguments As System.Collections.Generic.IDictionary(Of String, Mapping)) As Mapping
    55. Return Me
    56. End Function
    57. End Class
    58. Public Class Logarithm
    59. Inherits Mapping
    60. Private _base As Mapping
    61. Private _argument As Mapping
    62. Public Sub New(ByVal base As Mapping, ByVal argument As Mapping)
    63. If base Is Nothing Then Throw New ArgumentNullException("base")
    64. If argument Is Nothing Then Throw New ArgumentNullException("argument")
    65. _base = base
    66. _argument = argument
    67. End Sub
    68. Public ReadOnly Property Base As Mapping
    69. Get
    70. Return _base
    71. End Get
    72. End Property
    73. Public ReadOnly Property Argument As Mapping
    74. Get
    75. Return _argument
    76. End Get
    77. End Property
    78. Public Shared Function Ln(ByVal argument As Mapping) As Logarithm
    79. Return New Logarithm(New Constant(Math.E), argument)
    80. End Function
    81. Public Overrides Function Differentiate(ByVal variable As String) As Mapping
    82. Return New Subtraction(New Division(Argument.Differentiate(variable), New Multiplication(Argument, Ln(Base))), _
    83. New Multiplication(New Division(Ln(Argument), Power.Sq(Base)), Ln(Base.Differentiate(variable))))
    84. End Function
    85. Public Overloads Overrides Function Equals(ByVal other As Mapping) As Boolean
    86. If other Is Nothing OrElse Not TypeOf other Is Logarithm Then Return False
    87. With DirectCast(other, Logarithm)
    88. Return .Base.Equals(Base) AndAlso .Argument.Equals(Argument)
    89. End With
    90. End Function
    91. Public Overrides Function GetHashCode() As Integer
    92. Return Base.GetHashCode() Xor Argument.GetHashCode()
    93. End Function
    94. Public Overloads Overrides Sub ToString(ByVal builder As System.Text.StringBuilder)
    95. builder.Append("log_")
    96. If Base.IsValue Then
    97. Base.ToString(builder)
    98. Else
    99. builder.Append("("c)
    100. Base.ToString(builder)
    101. builder.Append(")"c)
    102. End If
    103. builder.Append(" "c)
    104. If Argument.IsValue Then
    105. Argument.ToString(builder)
    106. Else
    107. builder.Append("("c)
    108. Argument.ToString(builder)
    109. builder.Append(")"c)
    110. End If
    111. End Sub
    112. Public Overrides Function Apply(ByVal arguments As System.Collections.Generic.IDictionary(Of String, Mapping)) As Mapping
    113. Dim lv As Mapping = Base.Apply(arguments)
    114. Dim rv As Mapping = Argument.Apply(arguments)
    115. If TypeOf lv Is Constant AndAlso TypeOf rv Is Constant Then
    116. Return New Constant(Math.Log(DirectCast(rv, Constant).Value, DirectCast(lv, Constant).Value))
    117. Else
    118. Return New Logarithm(lv, rv)
    119. End If
    120. End Function
    121. End Class
    122. Public MustInherit Class BinaryOperation
    123. Inherits Mapping
    124. Private _left, _right As Mapping
    125. Protected MustOverride ReadOnly Property OperatorSign As Char
    126. Public Sub New(ByVal left As Mapping, ByVal right As Mapping)
    127. If left Is Nothing Then Throw New ArgumentNullException("left")
    128. If right Is Nothing Then Throw New ArgumentNullException("right")
    129. _left = left
    130. _right = right
    131. End Sub
    132. Public ReadOnly Property Left As Mapping
    133. Get
    134. Return _left
    135. End Get
    136. End Property
    137. Public ReadOnly Property Right As Mapping
    138. Get
    139. Return _right
    140. End Get
    141. End Property
    142. Public Overrides Function GetHashCode() As Integer
    143. Return Left.GetHashCode() Xor Right.GetHashCode()
    144. End Function
    145. Public Overloads Overrides Function Equals(ByVal other As Mapping) As Boolean
    146. If other Is Nothing OrElse Not Me.GetType().IsAssignableFrom(other.GetType()) Then Return False
    147. With DirectCast(other, Addition)
    148. Return Left.Equals(.Left) AndAlso Right.Equals(.Right)
    149. End With
    150. End Function
    151. Public Overloads Overrides Sub ToString(ByVal builder As System.Text.StringBuilder)
    152. If Left.IsValue Then
    153. Left.ToString(builder)
    154. Else
    155. builder.Append("("c)
    156. Left.ToString(builder)
    157. builder.Append(")"c)
    158. End If
    159. builder.Append(OperatorSign)
    160. If Right.IsValue Then
    161. Right.ToString(builder)
    162. Else
    163. builder.Append("("c)
    164. Right.ToString(builder)
    165. builder.Append(")"c)
    166. End If
    167. End Sub
    168. End Class
    169. Public Class Addition
    170. Inherits BinaryOperation
    171. Public Sub New(ByVal left As Mapping, ByVal right As Mapping)
    172. MyBase.New(left, right)
    173. End Sub
    174. Public Overrides Function Differentiate(ByVal variable As String) As Mapping
    175. Return New Addition(Left.Differentiate(variable), Right.Differentiate(variable))
    176. End Function
    177. Protected Overrides ReadOnly Property OperatorSign As Char
    178. Get
    179. Return "+"c
    180. End Get
    181. End Property
    182. Public Overrides Function Apply(ByVal arguments As System.Collections.Generic.IDictionary(Of String, Mapping)) As Mapping
    183. Dim lv As Mapping = Left.Apply(arguments)
    184. Dim rv As Mapping = Right.Apply(arguments)
    185. If TypeOf lv Is Constant AndAlso TypeOf rv Is Constant Then
    186. Return New Constant(DirectCast(rv, Constant).Value + DirectCast(lv, Constant).Value)
    187. Else
    188. Return New Addition(lv, rv)
    189. End If
    190. End Function
    191. End Class
    192. Public Class Subtraction
    193. Inherits BinaryOperation
    194. Public Sub New(ByVal left As Mapping, ByVal right As Mapping)
    195. MyBase.New(left, right)
    196. End Sub
    197. Public Overrides Function Differentiate(ByVal variable As String) As Mapping
    198. Return New Subtraction(Left.Differentiate(variable), Right.Differentiate(variable))
    199. End Function
    200. Protected Overrides ReadOnly Property OperatorSign As Char
    201. Get
    202. Return "-"c
    203. End Get
    204. End Property
    205. Public Overrides Function Apply(ByVal arguments As System.Collections.Generic.IDictionary(Of String, Mapping)) As Mapping
    206. Dim lv As Mapping = Left.Apply(arguments)
    207. Dim rv As Mapping = Right.Apply(arguments)
    208. If TypeOf lv Is Constant AndAlso TypeOf rv Is Constant Then
    209. Return New Constant(DirectCast(rv, Constant).Value - DirectCast(lv, Constant).Value)
    210. Else
    211. Return New Addition(lv, rv)
    212. End If
    213. End Function
    214. End Class
    215. Public Class Multiplication
    216. Inherits BinaryOperation
    217. Public Sub New(ByVal left As Mapping, ByVal right As Mapping)
    218. MyBase.New(left, right)
    219. End Sub
    220. Public Overrides Function Differentiate(ByVal variable As String) As Mapping
    221. Return New Addition(New Multiplication(Left.Differentiate(variable), Right), New Multiplication(Left, Right.Differentiate(variable)))
    222. End Function
    223. Protected Overrides ReadOnly Property OperatorSign As Char
    224. Get
    225. Return "*"c
    226. End Get
    227. End Property
    228. Public Overrides Function Apply(ByVal arguments As System.Collections.Generic.IDictionary(Of String, Mapping)) As Mapping
    229. Dim lv As Mapping = Left.Apply(arguments)
    230. Dim rv As Mapping = Right.Apply(arguments)
    231. If TypeOf lv Is Constant AndAlso TypeOf rv Is Constant Then
    232. Return New Constant(DirectCast(rv, Constant).Value * DirectCast(lv, Constant).Value)
    233. Else
    234. Return New Addition(lv, rv)
    235. End If
    236. End Function
    237. End Class
    238. Public Class Division
    239. Inherits BinaryOperation
    240. Public Sub New(ByVal left As Mapping, ByVal right As Mapping)
    241. MyBase.New(left, right)
    242. End Sub
    243. Public Overrides Function Differentiate(ByVal variable As String) As Mapping
    244. Return New Division(New Subtraction(New Multiplication(Left.Differentiate(variable), Right), New Multiplication(Left, Right.Differentiate(variable))), Power.Sq(Right))
    245. End Function
    246. Protected Overrides ReadOnly Property OperatorSign As Char
    247. Get
    248. Return "/"c
    249. End Get
    250. End Property
    251. Public Overrides Function Apply(ByVal arguments As System.Collections.Generic.IDictionary(Of String, Mapping)) As Mapping
    252. Dim lv As Mapping = Left.Apply(arguments)
    253. Dim rv As Mapping = Right.Apply(arguments)
    254. If TypeOf lv Is Constant AndAlso TypeOf rv Is Constant Then
    255. Return New Constant(DirectCast(rv, Constant).Value / DirectCast(lv, Constant).Value)
    256. Else
    257. Return New Addition(lv, rv)
    258. End If
    259. End Function
    260. End Class
    261. Public Class Power
    262. Inherits BinaryOperation
    263. Public Sub New(ByVal base As Mapping, ByVal power As Mapping)
    264. MyBase.New(base, power)
    265. End Sub
    266. Public Shared Function Sq(ByVal mapping As Mapping) As Power
    267. Return New Power(mapping, New Constant(2))
    268. End Function
    269. Public Shared Function Sqrt(ByVal mapping As Mapping) As Power
    270. Return New Power(mapping, New Constant(0.5))
    271. End Function
    272. Public Shared Function Rt(ByVal mapping As Mapping, ByVal rootExponent As Double) As Power
    273. Return New Power(mapping, New Constant(1 / rootExponent))
    274. End Function
    275. Public Shared Function Exp(ByVal mapping As Mapping) As Power
    276. Return New Power(New Constant(Math.E), mapping)
    277. End Function
    278. Public Overrides Function Differentiate(ByVal variable As String) As Mapping
    279. Return New Multiplication(Me, New Addition(New Multiplication(New Division(Left.Differentiate(variable), Left), Right), New Multiplication(Logarithm.Ln(Left), Right.Differentiate(variable))))
    280. End Function
    281. Protected Overrides ReadOnly Property OperatorSign As Char
    282. Get
    283. Return "^"c
    284. End Get
    285. End Property
    286. Public Overrides Function Apply(ByVal arguments As System.Collections.Generic.IDictionary(Of String, Mapping)) As Mapping
    287. Dim lv As Mapping = Left.Apply(arguments)
    288. Dim rv As Mapping = Right.Apply(arguments)
    289. If TypeOf lv Is Constant AndAlso TypeOf rv Is Constant Then
    290. Return New Constant(Math.Pow(DirectCast(lv, Constant).Value, DirectCast(rv, Constant).Value))
    291. Else
    292. Return New Addition(lv, rv)
    293. End If
    294. End Function
    295. End Class
    296. Public Class Variable
    297. Inherits Mapping
    298. Private _name As String
    299. Public Sub New(ByVal name As String)
    300. If name Is Nothing Then Throw New ArgumentNullException("name")
    301. If String.IsNullOrWhiteSpace(name) Then Throw New ArgumentException("Invalid variable name.")
    302. _name = name
    303. End Sub
    304. Public Overrides Function Apply(ByVal arguments As System.Collections.Generic.IDictionary(Of String, Mapping)) As Mapping
    305. Dim p As Mapping = Nothing
    306. If Not arguments.TryGetValue(name, p) Then
    307. p = Nothing
    308. End If
    309. Return If(p, Me)
    310. End Function
    311. Public Overrides Function Differentiate(ByVal variable As String) As Mapping
    312. Return New Constant(If(name = variable, 1, 0))
    313. End Function
    314. Public Overloads Overrides Function Equals(ByVal other As Mapping) As Boolean
    315. Return other IsNot Nothing AndAlso TypeOf other Is Variable AndAlso DirectCast(other, Variable).Name = Name
    316. End Function
    317. Public ReadOnly Property Name As String
    318. Get
    319. Return _name
    320. End Get
    321. End Property
    322. Public Overrides Function GetHashCode() As Integer
    323. Return _name.GetHashCode()
    324. End Function
    325. Public Overloads Overrides Sub ToString(ByVal builder As System.Text.StringBuilder)
    326. builder.Append(Name)
    327. End Sub
    328. Public Overrides ReadOnly Property IsValue As Boolean
    329. Get
    330. Return True
    331. End Get
    332. End Property
    333. End Class


    Vereinfachung, etc. kann man über eine Pattern matchende Klasse einführen, Integrale ggf. über eine Helferklasse, da die wohl etwas komplizierter sind, als Ableitungen.

    Edit: das ganze lässt sich natürlich auch beliebig ausweiten, wie z.B. auf Vektoren oder partielle Differentiation. Bei meinem (pausierten) Matheparser war bereits so viel Abstraktion vorhanden, dass zur Laufzeit dynamische Definitionen und Beweise aufgestellt werden konnten. Außerdem gab's Mengen, Relationen, etc. War vom Abstraktionsgrad einfach nur noch zu bescheuert zum Bedienen, deswegen wollte ich da auch nochmal von vorne anfangen.

    Habe oben auch noch eine Variable-Deklaration vergessen und dass die Ableitung nach einer Variablen zu definieren ist. Hab's korrigiert, so ein blöder Fehler...

    Edit: Nochmal ein paar Schönheitsfehler und einen Fehler bei Power entfernt. Zusätzlich noch ein paar Funktionen hinzugefügt.

    Gruß
    ~blaze~

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „~blaze~“ ()

    Thilo87 schrieb:

    und bräuchtest keine Ableitungsregeln verwenden.
    Integrieren ist eine Kunst.
    Differenzieren ist ein Handwerk.
    @faxe1008:: Iwo musst Du ja Deine Funktion selbst vorgeben.
    Entweder Du rechnest davon eine Ableitung nach Schema F aus
    oder
    Du gibst die ersten n Ableitungen gleich mit vor.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Integrieren ist eine Kunst.

    Differenzieren ist ein Handwerk.
    Woher hast du denn das? ^^ Beim Integrieren wird doch nur eine Funktion gesucht, deren Differentiation die ursprüngliche Funktion ergibt. Meines Erachtens unterscheiden sich somit Integration und Differentiation nicht viel voneinander, das eine ist quasi nur die Umkehrfunktion zur anderen. Die Integration kann man eben genauso, wie es faxe auch schon gemacht hat, mit Rechtecken annähern.
    Natürlich, ohne Näherung ist es etwas völlig anderes. Auch zu beachten ist, dass für die meisten Funktionen überhaupt keine exakte Ableitung oder Integral mehr gebildet werden kann. So kommt es, dass selbst Wolfram Alpha da oft nur noch Näherungen rausgibt.
    Differentiation ist stupides Anwenden von Regeln, wie das oben von mir. Integrieren ist wesentlich schwieriger, da Werte entfernt werden, nicht hinzugefügt. Somit musst du gewisse Muster und Umformungen durchführen, ähnlich dem Lösen einer Gleichung. Schau' dir nur mal partielles Integrieren oder dergleichen an. Die folgen direkt aus den Ableitungsregeln. Häufig folgen auch Umstellen von Funktionen, etc.
    Ableitungen sind wesentlich einfacher zu bilden, als Integrale. Das sieht man z.B. bei e^(-x^2). Ableiten kann man, denk' ich mal, immer, solange die Voraussetzungen erfüllt sind, Integrieren sicher auch, aber das Ergebnis ist nicht immer das, was man sich erhofft.

    Gruß
    ~blaze~

    Thilo87 schrieb:

    Woher hast du denn das?
    Von meinem Vater, und der hat mal früher Mathematik unterrichtet.
    Ableiten geht immer, integrieren halt nur gelegentlich.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!