Интеграл Монте-Карло: TypeError: '>' не поддерживается между экземплярами 'complex' и 'int' - PullRequest
0 голосов
/ 30 сентября 2019

Для универа мне нужно написать программу, использующую def и random для вычисления и построения интеграла различных функций. Такие функции, как «sin (x)» и «x ^ 2» работают нормально, и обе дают правильные вычисления и результаты построения. Но код должен работать, если диапазон не начинается с 0 и когда функция опускается ниже оси x. Тем не менее, моя текущая реализация выдает сообщение об ошибке TypeError: '>' not supported between instances of 'complex' and 'int' Я был в этом в течение 10 часов, просто не могу понять, что не так.

import random
import numpy as np
import matplotlib
matplotlib.use('tkagg')
import matplotlib.pyplot as plt

def montecarlo(functie1,x1,x2,y1,y2): 
    f = functie1(x)
    true_point_x = []
    true_point_y = []
    false_point_x = []
    false_point_y = []
    positive_true = 0 
    negative_true = 0
    n = 100000

    for i in range(n):
        x = (x2-x1) * random.random() + x1
        y = (y2-y1) * random.random() + y1
        if f > 0:
            if y <= f and y > 0:
                true_point_x.append(x)
                true_point_y.append(y)
                positive_true += 1
            else:
                false_point_x.append(x)
                false_point_y.append(y)
                negative_true += 1
        else:
            if y >= f and y < 0:
                true_point_x.append(x)
                true_point_y.append(y)
                positive_true -= 1
            else:
                false_point_x.append(x)
                false_point_y.append(y)
                negative_true += 1

    plt.plot(true_point_x,true_point_y, 'o', markerfacecolor='g', markeredgecolor='k')
    plt.plot(false_point_x,false_point_y, 'o', markerfacecolor='r', markeredgecolor='k')
    plt.show()

    surface = (x2-x1)*(y2-y1)
    integral = surface * positive_true / n
def functie1(x):
    return x ** (x + 0.5)
montecarlo(functie1, -1, 2.2, -1, 1)

1 Ответ

0 голосов
/ 01 октября 2019

Прежде всего, ваш код не будет работать. Строка f = functie1(x) должна быть перемещена в цикле for после того, как установлены x и y.

Во-вторых, функция, которую вы пытаетесь интегрировать, выдает действительные числа только в том случае, если x больше чем0. Для отрицательных значений x функция возвращает комплексное число, которое нельзя сравнить с int числами (что вы пытаетесь сделать и на что жалуется python). В вашей текущей реализации вы должны убедиться, что все действительные числа между x1 и x2 являются частью домена функции, которую вы хотите интегрировать.

...