Как я могу перебрать список букв, чтобы назначить значения с плавающей точкой для создания полинома?

Я пытаюсь интегрировать полиномиальную функцию с помощью трапециевидного метода (позже я могу перейти на более точный метод). Мой код не идеален, и я бы хотел точно понять, почему он не работает. Одна проблема у меня заключается в том, что цикл while не заканчивается. Мой код до сих пор выглядит следующим образом.

    def Integrate_Trapezoidal(x_LoBound,x_HiBound,N):
        """
        INPUT   :
                    x_LoBound   --      lower bound of integral
                    x_HiBound   --      upper bound of integral
                    N           --      number of slices (N --> inf ==> integral)
        OUTPUT  :
                                --      approximate value of integral
        """
        ## CREATE ALPHABET
        alphabet = [chr(i) for i in range(ord('a'),ord('z')+1)]
        ## alphabet = ['a','b','c',...,'z'] ##
        ## WOULD LOVE TO TRY FLOATING INPUTS VIA ARRAY COMPREHENSION
        a = float(input("What is the coefficient of the lowest order term:  "))
        CoeffList = []
        CoeffNumList = []
        LengthCoeffList = [] ## [1,2,3,...,max] where max = coefficient of highest-order term
        for letter in alphabet:
            AddOne = int(1)
            AddOne += int(1)
            for i in range(int(1),int(AddOne)):
                letter = alphabet[int(i)]
                while letter in alphabet:
                    CoeffList.append(letter)
                    LengthCoeffList.append(len(CoeffList))
                    # alphabet[i]
                    # i = i + 1
                    letter = float(input("What is the coefficient of the next-order term:  ")) ## GO FROM a = ___ TO b = ___ TO c = ___ ...
                    CoeffNumList.append(letter)
                    if float(input("What is the coefficient of the next-order term:  ")) == '0':
                        print("Type 'Y for YES and 'N' for NO")
                        YESorNO = str(input("Is that the last term of the polynomial:  "))
                        endterm = YESorNO[-1] ## look at last character of string
                        if endterm == 'N' or endterm == 'n' or endterm == 'no' or endterm == 'NO' or endterm == 'No':
                            pass
                        elif endterm == 'Y' or endterm == 'y' or endterm == 'YES' or endterm == 'yes' or endterm == 'Yes':
                            break
                            def f(x):
                                """
                                INPUT   :
                                                   x    --  variable of function
                                                        EX: x = x_LoBound OR x = x_HiBound
                                OUTPUT  :
                                            function    --  f(x) = a x^0 + b x^1 + ...
                                                        EX: f(x_LoBound) OR f(x_HiBound)
                                """
                                for expval in LengthCoeffList and CoeffNum in CoeffNumList:
                                    # function = 0
                                    function += CoeffNum * x**expval
                                    return function
                    letter = alphabet[int(i+1)] ## GO FROM a TO b TO c ...
        ## TRAPEZOIDAL RULE
        # def f(x):
        #     return x**4 - 2*x + 1
        ht = (x_HiBound - x_LoBound) / N
        ss = 0.5 * f(x_LoBound) + 0.5 * f(x_HiBound)
        for num in range(1,N):
            ss += f(x_LoBound + num*ht)
        return ht*ss
    checkanswer = Integrate_Trapezoidal(0,2,10)
    print(checkanswer)

1 ответ

Решение

Я попытался просмотреть ваш код и нашел что-то, что, я думаю, работает, проверив парочку раздаточных материалов колледжа, которые я скачал. Как вы сказали в комментариях, было много лишних списков, в которых нет необходимости, поэтому я сильно сократил код.

В частности, если допущение, что каждый коэффициент добавляется в последовательности от низшего к высшему порядку, и 0 добавляется для любого, которого нет, все, что вам нужно, это номер элемента в списке, чтобы узнать степень х,

Я также перенес определение f() создать вспомогательную функцию solve_point() который работает так же, я думаю. Особенно, sum а также enumerate встроены, с enumerate перебирая coeff_list и также возвращает счетчик, чтобы дать власть (0 вверх).

get_coefficients() был от твоего старого Integrate_Trapezoidal() но больше сосредоточены только на одном - именно поэтому он затем возвращает CoeffList быть окончательно обработанным в конце.

def solve_point(x, coeff_list):
    return sum(coeff * x**e for e, coeff in enumerate(coeff_list))


def get_coefficients():
    CoeffList = []
    while True:
        # GO FROM a = ___ TO b = ___ TO c = ___ ...
        coeff = float(input("What is the coefficient of the next-order term:  "))
        CoeffList.append(coeff)
        if coeff == 0:
            YESorNO = raw_input("Is that the last term of the polynomial: [Y/N]  ")
            if YESorNO.upper() == 'Y':
                return CoeffList[:-1]

lo, hi, n = 0, 2, 6
coeff_list = get_coefficients()

ht = (hi - lo) / float(n)
ss = 0.5 * solve_point(lo, coeff_list) + 0.5 * solve_point(hi, coeff_list)
for num in range(1,n):
    ss += solve_point(lo + num*ht, coeff_list)
checkanswer = ht*ss


print(checkanswer)

Я думаю, что это правильно - я сделал пару проверок. Надеюсь, это поможет вам переписать! Если у вас есть какие-либо примеры, которые не работают, было бы полезно узнать, или какие-либо ошибки, которые вы можете увидеть...

Другие вопросы по тегам