Допилил stubs
Улучшил отчёт, добавил скрины
This commit is contained in:
BIN
docs/image_2026-04-24_12-47-01.png
Executable file
BIN
docs/image_2026-04-24_12-47-01.png
Executable file
Binary file not shown.
|
After Width: | Height: | Size: 66 KiB |
BIN
docs/Снимок экрана_20260424_125552.png
Normal file
BIN
docs/Снимок экрана_20260424_125552.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 32 KiB |
@@ -58,7 +58,7 @@ fun main(args: Array<String>) {
|
|||||||
val result = computeFunc(x, eps)
|
val result = computeFunc(x, eps)
|
||||||
data.add(x to result)
|
data.add(x to result)
|
||||||
} catch (_: Exception) {
|
} catch (_: Exception) {
|
||||||
// skip discontinuities
|
// скипать точки, где функция не определена
|
||||||
}
|
}
|
||||||
x += step
|
x += step
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,10 +1,59 @@
|
|||||||
package function.stubs
|
package function.stubs
|
||||||
|
|
||||||
import function.trigonometric.ICos
|
import function.trigonometric.ICos
|
||||||
|
import kotlin.math.PI
|
||||||
|
import kotlin.math.abs
|
||||||
|
|
||||||
class CosStub : ICos {
|
class CosStub : ICos {
|
||||||
|
private val table =
|
||||||
|
mapOf(
|
||||||
|
-PI to -1.0,
|
||||||
|
-PI / 2 to 0.0,
|
||||||
|
-1.0 to 0.5403,
|
||||||
|
-0.5 to 0.8776,
|
||||||
|
0.0 to 1.0,
|
||||||
|
0.5 to 0.8776,
|
||||||
|
1.0 to 0.5403,
|
||||||
|
PI / 2 to 0.0,
|
||||||
|
PI to -1.0,
|
||||||
|
3.0 to -0.98999,
|
||||||
|
)
|
||||||
|
|
||||||
override fun cos(
|
override fun cos(
|
||||||
x: Double,
|
x: Double,
|
||||||
eps: Double,
|
eps: Double,
|
||||||
): Double = 1.0
|
): Double {
|
||||||
|
var nx = x % (2 * PI)
|
||||||
|
if (nx > PI) nx -= 2 * PI
|
||||||
|
if (nx < -PI) nx += 2 * PI
|
||||||
|
|
||||||
|
var closestX = table.keys.first()
|
||||||
|
var minDiff = abs(nx - closestX)
|
||||||
|
for (kx in table.keys) {
|
||||||
|
val diff = abs(nx - kx)
|
||||||
|
if (diff < minDiff) {
|
||||||
|
minDiff = diff
|
||||||
|
closestX = kx
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (minDiff < 0.1) return table[closestX]!!
|
||||||
|
|
||||||
|
val sortedKeys = table.keys.sorted()
|
||||||
|
for (i in 0 until sortedKeys.size - 1) {
|
||||||
|
val k1 = sortedKeys[i]
|
||||||
|
val k2 = sortedKeys[i + 1]
|
||||||
|
if (nx in k1..k2) {
|
||||||
|
val y1 = table[k1]!!
|
||||||
|
val y2 = table[k2]!!
|
||||||
|
val t = (nx - k1) / (k2 - k1)
|
||||||
|
return y1 + t * (y2 - y1)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
val k1 = sortedKeys[sortedKeys.size - 2]
|
||||||
|
val k2 = sortedKeys.last()
|
||||||
|
val y1 = table[k1]!!
|
||||||
|
val y2 = table[k2]!!
|
||||||
|
val t = (nx - k1) / (k2 - k1)
|
||||||
|
return y1 + t * (y2 - y1)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,10 +1,58 @@
|
|||||||
package function.stubs
|
package function.stubs
|
||||||
|
|
||||||
import function.trigonometric.ICot
|
import function.trigonometric.ICot
|
||||||
|
import kotlin.math.PI
|
||||||
|
import kotlin.math.abs
|
||||||
|
|
||||||
class CotStub : ICot {
|
class CotStub : ICot {
|
||||||
|
private val table =
|
||||||
|
mapOf(
|
||||||
|
-PI + 0.1 to -10.0,
|
||||||
|
-PI / 2 to 0.0,
|
||||||
|
-1.0 to -0.6421,
|
||||||
|
-0.5 to -1.8305,
|
||||||
|
0.5 to 1.8305,
|
||||||
|
1.0 to 0.6421,
|
||||||
|
PI / 2 to 0.0,
|
||||||
|
PI - 0.1 to 10.0,
|
||||||
|
)
|
||||||
|
|
||||||
override fun cot(
|
override fun cot(
|
||||||
x: Double,
|
x: Double,
|
||||||
eps: Double,
|
eps: Double,
|
||||||
): Double = 1.0
|
): Double {
|
||||||
|
if (abs(x % PI) < 1e-8) throw ArithmeticException("Cot is undefined at x = k*PI")
|
||||||
|
var nx = x % (2 * PI)
|
||||||
|
if (nx > PI) nx -= 2 * PI
|
||||||
|
if (nx < -PI) nx += 2 * PI
|
||||||
|
|
||||||
|
var closestX = table.keys.first()
|
||||||
|
var minDiff = abs(nx - closestX)
|
||||||
|
for (kx in table.keys) {
|
||||||
|
val diff = abs(nx - kx)
|
||||||
|
if (diff < minDiff) {
|
||||||
|
minDiff = diff
|
||||||
|
closestX = kx
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (minDiff < 0.2) return table[closestX]!!
|
||||||
|
|
||||||
|
val sortedKeys = table.keys.sorted()
|
||||||
|
for (i in 0 until sortedKeys.size - 1) {
|
||||||
|
val k1 = sortedKeys[i]
|
||||||
|
val k2 = sortedKeys[i + 1]
|
||||||
|
if (nx in k1..k2) {
|
||||||
|
val y1 = table[k1]!!
|
||||||
|
val y2 = table[k2]!!
|
||||||
|
val t = (nx - k1) / (k2 - k1)
|
||||||
|
return y1 + t * (y2 - y1)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
val k1 = sortedKeys[sortedKeys.size - 2]
|
||||||
|
val k2 = sortedKeys.last()
|
||||||
|
val y1 = table[k1]!!
|
||||||
|
val y2 = table[k2]!!
|
||||||
|
val t = (nx - k1) / (k2 - k1)
|
||||||
|
return y1 + t * (y2 - y1)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,10 +1,58 @@
|
|||||||
package function.stubs
|
package function.stubs
|
||||||
|
|
||||||
import function.trigonometric.ICsc
|
import function.trigonometric.ICsc
|
||||||
|
import kotlin.math.PI
|
||||||
|
import kotlin.math.abs
|
||||||
|
|
||||||
class CscStub : ICsc {
|
class CscStub : ICsc {
|
||||||
|
private val table =
|
||||||
|
mapOf(
|
||||||
|
-PI + 0.1 to -10.0, // около полюса
|
||||||
|
-PI / 2 to -1.0,
|
||||||
|
-1.0 to -1.1884,
|
||||||
|
-0.5 to -2.0858,
|
||||||
|
0.5 to 2.0858,
|
||||||
|
1.0 to 1.1884,
|
||||||
|
PI / 2 to 1.0,
|
||||||
|
PI - 0.1 to 10.0,
|
||||||
|
)
|
||||||
|
|
||||||
override fun csc(
|
override fun csc(
|
||||||
x: Double,
|
x: Double,
|
||||||
eps: Double,
|
eps: Double,
|
||||||
): Double = 1.0
|
): Double {
|
||||||
|
if (abs(x % PI) < 1e-8) throw ArithmeticException("Csc is undefined at x = k*PI")
|
||||||
|
var nx = x % (2 * PI)
|
||||||
|
if (nx > PI) nx -= 2 * PI
|
||||||
|
if (nx < -PI) nx += 2 * PI
|
||||||
|
|
||||||
|
var closestX = table.keys.first()
|
||||||
|
var minDiff = abs(nx - closestX)
|
||||||
|
for (kx in table.keys) {
|
||||||
|
val diff = abs(nx - kx)
|
||||||
|
if (diff < minDiff) {
|
||||||
|
minDiff = diff
|
||||||
|
closestX = kx
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (minDiff < 0.2) return table[closestX]!!
|
||||||
|
|
||||||
|
val sortedKeys = table.keys.sorted()
|
||||||
|
for (i in 0 until sortedKeys.size - 1) {
|
||||||
|
val k1 = sortedKeys[i]
|
||||||
|
val k2 = sortedKeys[i + 1]
|
||||||
|
if (nx in k1..k2) {
|
||||||
|
val y1 = table[k1]!!
|
||||||
|
val y2 = table[k2]!!
|
||||||
|
val t = (nx - k1) / (k2 - k1)
|
||||||
|
return y1 + t * (y2 - y1)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
val k1 = sortedKeys[sortedKeys.size - 2]
|
||||||
|
val k2 = sortedKeys.last()
|
||||||
|
val y1 = table[k1]!!
|
||||||
|
val y2 = table[k2]!!
|
||||||
|
val t = (nx - k1) / (k2 - k1)
|
||||||
|
return y1 + t * (y2 - y1)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,10 +1,55 @@
|
|||||||
package function.stubs
|
package function.stubs
|
||||||
|
|
||||||
import function.base.ILn
|
import function.base.ILn
|
||||||
|
import kotlin.math.E
|
||||||
|
import kotlin.math.abs
|
||||||
|
|
||||||
class LnStub : ILn {
|
class LnStub : ILn {
|
||||||
|
private val table =
|
||||||
|
mapOf(
|
||||||
|
0.1 to -2.302585,
|
||||||
|
0.5 to -0.693147,
|
||||||
|
1.0 to 0.0,
|
||||||
|
E to 1.0,
|
||||||
|
2.0 to 0.693147,
|
||||||
|
5.0 to 1.609438,
|
||||||
|
10.0 to 2.302585,
|
||||||
|
20.0 to 2.995732,
|
||||||
|
)
|
||||||
|
|
||||||
override fun ln(
|
override fun ln(
|
||||||
x: Double,
|
x: Double,
|
||||||
eps: Double,
|
eps: Double,
|
||||||
): Double = 1.0
|
): Double {
|
||||||
|
if (x <= 0) throw IllegalArgumentException("Ln is undefined for x <= 0")
|
||||||
|
var closestX = table.keys.first()
|
||||||
|
var minDiff = abs(x - closestX)
|
||||||
|
for (kx in table.keys) {
|
||||||
|
val diff = abs(x - kx)
|
||||||
|
if (diff < minDiff) {
|
||||||
|
minDiff = diff
|
||||||
|
closestX = kx
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (minDiff < 0.05) return table[closestX]!!
|
||||||
|
|
||||||
|
val sortedKeys = table.keys.sorted()
|
||||||
|
for (i in 0 until sortedKeys.size - 1) {
|
||||||
|
val k1 = sortedKeys[i]
|
||||||
|
val k2 = sortedKeys[i + 1]
|
||||||
|
if (x in k1..k2) {
|
||||||
|
val y1 = table[k1]!!
|
||||||
|
val y2 = table[k2]!!
|
||||||
|
val t = (x - k1) / (k2 - k1)
|
||||||
|
return y1 + t * (y2 - y1)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
val k1 = sortedKeys[sortedKeys.size - 2]
|
||||||
|
val k2 = sortedKeys.last()
|
||||||
|
val y1 = table[k1]!!
|
||||||
|
val y2 = table[k2]!!
|
||||||
|
val t = (x - k1) / (k2 - k1)
|
||||||
|
return y1 + t * (y2 - y1)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,11 +1,58 @@
|
|||||||
package function.stubs
|
package function.stubs
|
||||||
|
|
||||||
import function.logarithmic.ILog
|
import function.logarithmic.ILog
|
||||||
|
import kotlin.math.E
|
||||||
|
import kotlin.math.abs
|
||||||
|
import kotlin.math.log10
|
||||||
|
|
||||||
class LogStub : ILog {
|
class LogStub : ILog {
|
||||||
|
private val table =
|
||||||
|
mapOf(
|
||||||
|
0.1 to -1.0,
|
||||||
|
0.5 to -0.3010,
|
||||||
|
1.0 to 0.0,
|
||||||
|
E to 0.4343,
|
||||||
|
2.0 to 0.3010,
|
||||||
|
5.0 to 0.6990,
|
||||||
|
10.0 to 1.0,
|
||||||
|
20.0 to 1.3010,
|
||||||
|
)
|
||||||
|
|
||||||
override fun log(
|
override fun log(
|
||||||
base: Double,
|
base: Double,
|
||||||
x: Double,
|
x: Double,
|
||||||
eps: Double,
|
eps: Double,
|
||||||
): Double = 1.0
|
): Double {
|
||||||
|
if (base <= 0 || base == 1.0) throw IllegalArgumentException("Log base must be > 0 and != 1")
|
||||||
|
if (x <= 0) throw IllegalArgumentException("Log argument must be > 0")
|
||||||
|
if (abs(base - 10.0) > 1e-5) return log10(x)
|
||||||
|
var closestX = table.keys.first()
|
||||||
|
var minDiff = abs(x - closestX)
|
||||||
|
for (kx in table.keys) {
|
||||||
|
val diff = abs(x - kx)
|
||||||
|
if (diff < minDiff) {
|
||||||
|
minDiff = diff
|
||||||
|
closestX = kx
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (minDiff < 0.1) return table[closestX]!!
|
||||||
|
|
||||||
|
val sortedKeys = table.keys.sorted()
|
||||||
|
for (i in 0 until sortedKeys.size - 1) {
|
||||||
|
val k1 = sortedKeys[i]
|
||||||
|
val k2 = sortedKeys[i + 1]
|
||||||
|
if (x in k1..k2) {
|
||||||
|
val y1 = table[k1]!!
|
||||||
|
val y2 = table[k2]!!
|
||||||
|
val t = (x - k1) / (k2 - k1)
|
||||||
|
return y1 + t * (y2 - y1)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
val k1 = sortedKeys[sortedKeys.size - 2]
|
||||||
|
val k2 = sortedKeys.last()
|
||||||
|
val y1 = table[k1]!!
|
||||||
|
val y2 = table[k2]!!
|
||||||
|
val t = (x - k1) / (k2 - k1)
|
||||||
|
return y1 + t * (y2 - y1)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,10 +1,61 @@
|
|||||||
package function.stubs
|
package function.stubs
|
||||||
|
|
||||||
import function.trigonometric.ISec
|
import function.trigonometric.ISec
|
||||||
|
import kotlin.math.PI
|
||||||
|
import kotlin.math.abs
|
||||||
|
|
||||||
class SecStub : ISec {
|
class SecStub : ISec {
|
||||||
|
private val table =
|
||||||
|
mapOf(
|
||||||
|
-PI to -1.0,
|
||||||
|
-PI / 2 + 0.1 to 10.0,
|
||||||
|
-1.0 to 1.8508,
|
||||||
|
-0.5 to 1.1395,
|
||||||
|
0.0 to 1.0,
|
||||||
|
0.5 to 1.1395,
|
||||||
|
1.0 to 1.8508,
|
||||||
|
PI / 2 - 0.1 to 10.0,
|
||||||
|
PI to -1.0,
|
||||||
|
)
|
||||||
|
|
||||||
override fun sec(
|
override fun sec(
|
||||||
x: Double,
|
x: Double,
|
||||||
eps: Double,
|
eps: Double,
|
||||||
): Double = 1.0
|
): Double {
|
||||||
|
if (abs((x % (2 * PI)) - PI / 2) < 1e-8 || abs((x % (2 * PI)) + PI / 2) < 1e-8) {
|
||||||
|
throw ArithmeticException("Sec is undefined at x = PI/2 + k*PI")
|
||||||
|
}
|
||||||
|
var nx = x % (2 * PI)
|
||||||
|
if (nx > PI) nx -= 2 * PI
|
||||||
|
if (nx < -PI) nx += 2 * PI
|
||||||
|
|
||||||
|
var closestX = table.keys.first()
|
||||||
|
var minDiff = abs(nx - closestX)
|
||||||
|
for (kx in table.keys) {
|
||||||
|
val diff = abs(nx - kx)
|
||||||
|
if (diff < minDiff) {
|
||||||
|
minDiff = diff
|
||||||
|
closestX = kx
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (minDiff < 0.2) return table[closestX]!!
|
||||||
|
|
||||||
|
val sortedKeys = table.keys.sorted()
|
||||||
|
for (i in 0 until sortedKeys.size - 1) {
|
||||||
|
val k1 = sortedKeys[i]
|
||||||
|
val k2 = sortedKeys[i + 1]
|
||||||
|
if (nx in k1..k2) {
|
||||||
|
val y1 = table[k1]!!
|
||||||
|
val y2 = table[k2]!!
|
||||||
|
val t = (nx - k1) / (k2 - k1)
|
||||||
|
return y1 + t * (y2 - y1)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
val k1 = sortedKeys[sortedKeys.size - 2]
|
||||||
|
val k2 = sortedKeys.last()
|
||||||
|
val y1 = table[k1]!!
|
||||||
|
val y2 = table[k2]!!
|
||||||
|
val t = (nx - k1) / (k2 - k1)
|
||||||
|
return y1 + t * (y2 - y1)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,10 +1,63 @@
|
|||||||
package function.stubs
|
package function.stubs
|
||||||
|
|
||||||
import function.base.ISin
|
import function.base.ISin
|
||||||
|
import kotlin.math.PI
|
||||||
|
import kotlin.math.abs
|
||||||
|
|
||||||
class SinStub : ISin {
|
class SinStub : ISin {
|
||||||
|
private val table =
|
||||||
|
mapOf(
|
||||||
|
-PI to 0.0,
|
||||||
|
-PI / 2 to -1.0,
|
||||||
|
-1.0 to -0.8415,
|
||||||
|
-0.5 to -0.4794,
|
||||||
|
0.0 to 0.0,
|
||||||
|
0.5 to 0.4794,
|
||||||
|
1.0 to 0.8415,
|
||||||
|
PI / 2 to 1.0,
|
||||||
|
PI to 0.0,
|
||||||
|
3.0 to 0.1411,
|
||||||
|
)
|
||||||
|
|
||||||
override fun sin(
|
override fun sin(
|
||||||
x: Double,
|
x: Double,
|
||||||
eps: Double,
|
eps: Double,
|
||||||
): Double = 1.0
|
): Double {
|
||||||
|
// Нормализация в [-PI, PI]
|
||||||
|
var nx = x % (2 * PI)
|
||||||
|
if (nx > PI) nx -= 2 * PI
|
||||||
|
if (nx < -PI) nx += 2 * PI
|
||||||
|
|
||||||
|
// ближайшая точка в таблице
|
||||||
|
var closestX = table.keys.first()
|
||||||
|
var minDiff = abs(nx - closestX)
|
||||||
|
for (kx in table.keys) {
|
||||||
|
val diff = abs(nx - kx)
|
||||||
|
if (diff < minDiff) {
|
||||||
|
minDiff = diff
|
||||||
|
closestX = kx
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (minDiff < 0.1) return table[closestX]!!
|
||||||
|
|
||||||
|
// интерполяция линейно
|
||||||
|
val sortedKeys = table.keys.sorted()
|
||||||
|
for (i in 0 until sortedKeys.size - 1) {
|
||||||
|
val k1 = sortedKeys[i]
|
||||||
|
val k2 = sortedKeys[i + 1]
|
||||||
|
if (nx in k1..k2) {
|
||||||
|
val y1 = table[k1]!!
|
||||||
|
val y2 = table[k2]!!
|
||||||
|
val t = (nx - k1) / (k2 - k1)
|
||||||
|
return y1 + t * (y2 - y1)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// экстраполяция
|
||||||
|
val k1 = sortedKeys[sortedKeys.size - 2]
|
||||||
|
val k2 = sortedKeys.last()
|
||||||
|
val y1 = table[k1]!!
|
||||||
|
val y2 = table[k2]!!
|
||||||
|
val t = (nx - k1) / (k2 - k1)
|
||||||
|
return y1 + t * (y2 - y1)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user