Рассчитать значения функции f(x) в целочисленном интервале Python

Дана функция, вычисляющая значение переменной y в зависимости от переменной x. Дан интервал целых чисел, которые может принимать переменная x.

Необходимо написать программу на языке Python, которая выведет в текстовый файл result.txt значения переменной y для каждого из предложенных x.

Точность значений *у* при распечатке установить в 3 знака после запятой.
Кодировка в текстовом файле должна быть Unicode. Путь к входному и выходному файлу в коде программы нужно сделать относительным.

Сваял вот такое:

import math
import cmath
f = open('source_data.txt')
a = f.readlines()
for i in a:
x = float(i.strip('x='))

if x < -6:
    n = ((64 * x ** 7 - 44 * x ** 2 + 44) ** 5 + 56 * x ** 7) / (
            (15 * x ** 7 + x ** 3) ** 3 + (34 * x ** 2 + 15) ** 4)
    f1 = open("result.txt", 'a')
    f1.write("При x = " + str(x) + " значение y = " + str(n) + "\n")

elif -6 <= 0 and x < 0:

    n = (math.sqrt(((65 * x ** 4 + 47 * x ** 2 + 14) ** 5)) - 66 * x ** 3) / (
            (9 * x ** 6 + x ** 2) ** 5 + (71 * x ** 2 - 57) ** 5)
    print(n)
else:
    n = ((46 * x ** 7 + 39 * x ** 2 + 16) ** 8 - 91 * x ** 5) / ((27 * x ** 8 - x ** 3) ** 3 + cmath.sqrt(((8 * x - 65) ** 3)))
    print(n)

введите сюда описание изображения Интересует правильность ввода формул, как сделать точность до 3 знаков после запятой, и конечно же ошибки которые есть в коде.


Ответы (2 шт):

Автор решения: MarianD

Какие-то правки:

import math
import cmath


with open('source_data.txt') as f, open("result.txt", 'w', encoding="utf-8") as f1:
    for i in f:
        x = float(i.strip('x='))

        if x < -6:
            n = ((64 * x ** 7 - 44 * x ** 2 + 44) ** 5 + 56 * x ** 7) / (
                    (15 * x ** 7 + x ** 3) ** 3 + (34 * x ** 2 + 15) ** 4)

        elif -6 <= x < 0:
            n = (math.sqrt(((65 * x ** 4 + 47 * x ** 2 + 14) ** 5)) - 66 * x ** 3) / (
                    (9 * x ** 6 + x ** 2) ** 5 + (71 * x ** 2 - 57) ** 5)
            print(n)
        else:
            n = ((46 * x ** 7 + 39 * x ** 2 + 16) ** 8 - 91 * x ** 5) / ((27 * x ** 8 - x ** 3) ** 3 + cmath.sqrt(((8 * x - 65) ** 3)))
        f1.write("При x = {} значение y = {:.3e}\n".format(x, n))
        print("{:.3e}".format(n))

  1. Я не поверял ваши вычисления.
  2. Я исправил ошибки в отступах.
  3. Я исправил ошибку в команде elif -6 <= 0 and x < 0:
  4. open("result.txt", 'w', encoding="utf-8") (вместо вашего open("result.txt", 'a'))
  5. Точность значений у при распечатке установил в 3 знака после запятой.
  6. ... и что-то другое...

Я проверил этот код — вот мой выводной файл result.txt:

При x = 7.0 значение y = 1.125e+36-8.058e+12j
При x = -4.0 значение y = 5.859e-13
При x = -10.0 значение y = 3.182e+19
При x = 0.0 значение y = 0.000e+00-8.196e+06j
→ Ссылка
Автор решения: passant

После длительных "переговоров" вырисовывается следующее.

Если исходить из ДОСЛОВНОЙ трактовки вопроса, а именно - "как сделать точность до 3 знаков после запятой" оказывается, что просто написать, например

n = ((64 * x ** 7 - 44 * x ** 2 + 44) ** 5 + 56 * x ** 7) / (
                    (15 * x ** 7 + x ** 3) ** 3 + (34 * x ** 2 + 15) ** 4)

некорректно, потому что получаемый ответ, опять же например, при x = -10.0 дает значение y= 3.182e+19, а это НИКАК не 3 знака после запятой.

Что-бы получить именно знаки после запятой - можно написать так:

from decimal import Decimal
x=10
a=(64 * x ** 7 - 44 * x ** 2 + 44) ** 5 + 56 * x ** 7
b=((15 * x ** 7 + x ** 3) ** 3 + (34 * x ** 2 + 15) ** 4)
format(Decimal.from_float(a)/Decimal.from_float(b),'.3f')

Результат

'31812853625432199804.219'

Что в точности соответствует поставленному условию.

→ Ссылка