Были даны функции с 3 позиционными аргументами, но списком

#python #list #matplotlib

Вопрос:

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

Вот код, который я пишу:

 import numpy.polynomial.polynomial as ply
import matplotlib.pyplot as plt
import numpy as np

#Integration, Trapezoidal Method

# Define function to integrate
def f(x):
    return 2 5*x**7 4*x**2 2*x**5

def polynom():
    return [2, 0, 4, 0, 0, 2, 0, 5]

# Implementing trapezoidal method
def trapezoidal (x0,xn,n):
    # calculating step size
    h = (xn - x0) / n
    
    # Finding sum 
    integration = f(x0)   f(xn)
    
    for i in range(1,n):
        k = x0   i*h
        integration = integration   2 * f(k)
    
    # Finding final integration value
    integration = integration * h/2
    
    return integration

#Exact integration

# Find Indefinite integral
I = ply.polyint(polynom())

# Find Definite integral
a = lower_limit
b = upper_limit
A = ply.polyval(b, I) - ply.polyval(a, I)

# Input section
lower_limit = float(input("Enter lower limit of integration: "))
upper_limit = float(input("Enter upper limit of integration: "))
elements = int(input("Enter number of elements : "))

#Sub_interval list
n_interval = []

# iterating till the range
for val in range(0, elements):
    sub_interval = int(input("Enter number of sub intervals: "))

    n_interval.append(sub_interval) # adding the element

# Call trapezoidal() method and get result
result = trapezoidal(lower_limit, upper_limit, *n_interval) #The *n_interval is used to unpack the list.
print("Indefinite integral's constant of exact integration is: ", I)
print("Definite integral of the exact integration is: ", A)
print("Integration result by Trapezoidal method is: ", result)
print("Error value is: ", (((result-A)/A)*100))

# Plotting the error and with respects to "N"
xValue = [sub_interval, 0]
yValue = [0, ((result-A)/A)*100]

plt.plot(xValue, yValue)
plt.title("Comparison of 'N' to Error Values" )
plt.xlabel("N value")
plt.ylabel("Error value")
plt.show()
 

Программа выдала ошибку:

 trapezoidal() takes 3 positional arguments but 4 were given.
 

Проблема в том, что я не знаю, как изменить аргументы функций, в то же время все еще используя списки в качестве параметров.

Ответ №1:

Если вы хотите передавать списки в качестве параметров, вам не нужна звездочка (*).

Просто сделай:

 result = trapezoidal(lower_limit, upper_limit, n_interval)
 

Он передаст n_interval список в качестве параметра для трапециевидной формы.

Например:

 def trapezoidal(x0, xn, n):
    print(x0, xn, n)

trapezoidal(1, 10, [1, 2, 3, 4])
# n is a list
 

напечатает

 1 10 [1, 2, 3, 4]
 

Комментарии:

1. Это все равно дает значение ошибки. Ошибка типа: неподдерживаемые типы операндов для /: «с плавающей точкой» и «список». Это не может сработать, вероятно, потому, что (как я уже говорил в вопросе) функция имеет три параметра, в то время как функции должны работать с любым значением, которое вводит пользователь.

2. @nurhadidd это зависит от вашей функции. Вы можете использовать isinstance(n, list) в своей функции, чтобы определить, является ли это a list , и обработать его соответствующим образом.