Натуральный логарифм числа — это логарифм этого числа по основанию e (математическая константа). Представлено в виде математического утверждения:

Чтобы показать это лучше, мы могли бы также использовать:

Теперь вернемся к нашей первой проблеме: «Как вычислить ln(x)?»

Для первого шага мы собираемся найти ряд Маклорена, чтобы найти наш ответ:

So if -1≤t≤1:

И для последнего шага:

Мы также можем показать это уравнение:

Чтобы вычислить сам ln(x), мы используем простой прием: устанавливаем значение (x) равным (t-1):

Как вывод:

Но если вы помните, мы говорили, что это уравнение работает, только если -1≤x≤1.

Итак, как мы можем переписать эту формулу, чтобы вычислить ln(x) для x ∈ ℝ?

Но сначала давайте рассмотрим некоторые основные правила натурального логарифма:

Теперь вернемся к нашей собственной проблеме: мы можем представить каждое число в виде научной записи. Представлено в виде математического выражения:

Например:

Теперь давайте изменим эту научную запись:

Поскольку -10‹а‹10, то -1‹0,1а‹1. Как было сказано ранее, наше уравнение ln(x) работало, только если -1≤x≤1. Потом:

так как 10 не меньше 1:

Беглый взгляд на то, что мы получили:

Теперь давайте вычислим каждую часть с выражением, которое у нас было раньше:

Заключение:

Теперь, когда у нас есть окончательное уравнение, давайте приступим к его реализации в Node.js и Python 3.8.

Реализация на Python 3.8

Реализация функции ln в Python показана ниже. Сначала мы преобразуем x в его научную запись, затем делаем остальные вычисления. Обратите внимание, что, поскольку мы не можем вычислить это до бесконечности, мы должны закончить наши вычисления в какой-то момент; Поэтому мы устанавливаем ограничение на endOfCalc. Очевидно, что чем больше endOfCalc, тем точнее будет наш результат. Например, я установил для endOfCalc значение 370, потому что он по-прежнему работает гладко и дает нам результат с точностью до 10 знаков после запятой (максимум). Посмотри:

endOfCalc = 370
def ln(x):
    scientific_notation = "{:.12e}".format(x)
    scientific_notation = scientific_notation.replace('+','')
    a, b = map(float, scientific_notation.split('e'))
    output = 0
    for i in range(1,endOfCalc):
        output += (((a/10)-1)**i)*((-1)**(i+1))/i
        output -= (b+1)*((-0.9)**i)*((-1)**(i+1))/i
    return round(output,10)

Теперь для проверки добавим в программу ln(e) (e примерно равно 2,718281828459):

print(ln(2.718281828459))

Когда вы запустите его, вы получите 1.0; Это значит, что все получилось просто отлично.

Чтобы сократить время выполнения, разумно предварительно вычислить ln(0.1), что приблизительно равно -2,30258509299. Итак, окончательный код:

endOfCalc = 370
ln0_1 = -2.30258509299;
def ln(x):
    scientific_notation = "{:.12e}".format(x)
    scientific_notation = scientific_notation.replace('+','')
    a, b = map(float, scientific_notation.split('e'))
    output = 0
    for i in range(1,endOfCalc):
        output += (((a/10)-1)**i)*((-1)**(i+1))/i
    return round(output-(b+1)*ln0_1,10)

Опять же, вы можете проверить это с помощью метода, описанного ранее.

Реализация в Node.js

Реализация функции ln в Node.js показана ниже. Сначала мы преобразуем x в его научную запись, затем делаем остальные вычисления. Обратите внимание, что, поскольку мы не можем вычислить это до бесконечности, мы должны закончить наши вычисления в какой-то момент; Поэтому мы устанавливаем ограничение на endOfCalc. Очевидно, что чем больше endOfCalc, тем точнее будет наш результат. Например, я установил для endOfCalc значение 370, потому что он по-прежнему работает гладко и дает нам результат с точностью до 10 знаков после запятой. Посмотри:

endOfCalc = 370;
function ln(x){
    x = x.toExponential();
    x = x .replace('+','');
    let listed = x.split("e");
    a = Number(listed[0]);b = Number(listed[1]);
    output = 0;
    for(i = 1;i < endOfCalc;i++){
        output += (((a/10)-1)**i)*((-1)**(i+1))/i;
        output -= (b+1)*((-0.9)**i)*((-1)**(i+1))/i;
    }
    return (output).toFixed((10));
}

Теперь для проверки добавим в программу ln(e) (e примерно равно 2,718281828459):

console.log(ln(2.718281828459))

Когда вы запустите его, вы получите 1.0000000000; Это значит, что все получилось просто отлично.

Чтобы сократить время выполнения, разумно предварительно вычислить ln(0.1), что приблизительно равно -2,30258509299. Итак, окончательный код:

endOfCalc = 370;
ln0_1 = -2.30258509299;
function ln(x){
    x = x.toExponential();
    x = x .replace('+','');
    let listed = x.split("e");
    a = Number(listed[0]);b = Number(listed[1]);
    output = 0;
    for(i = 1;i < endOfCalc;i++){
        output+=(((a/10)-1)**i)*((-1)**(i+1))/i;
    }
    return (output-(b+1)*ln0_1).toFixed((10));
}

Опять же, вы можете проверить это с помощью метода, описанного ранее.