Натуральный логарифм числа — это логарифм этого числа по основанию 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)); }
Опять же, вы можете проверить это с помощью метода, описанного ранее.