Programmering

Trapezoidal rule: Integral i python

29. januar 2015 af Niko83 (Slettet)

Hej derude.
Jeg skal bestemme arealet under grafen fra a =0 til b= 9, der beskrives ved funktionen: f(x) = cos(x/9) * sin2(x):

Integralformlen er;                  

     \frac{1}{2}*y _{1}+\sum_{i=2}^{n-1}y_{i} + \frac{1}{2}* y_{n} 

Jeg har lavet en kode, der ser ud  sådan:
 

import math

import numpy as np

def f(x):
    return math.cos(x/9)*math.sin(x)**2
a=0
b = 10
x = np.linspace(a, b, 40)
delta_x = x[1]-x[0]
y = (f(x))* delta_x
Integral = (1/2) * (y[0]+ y[-1]) + sum(y[0:-1])

print Integral

Jeg får en fejlmeddelelse som:

  y = (f(x))* delta_x
  File "C:\Users\Asus\Desktop\Tesss.py", line 127, in f
    return math.cos(x/9)*math.sin(x)**2
TypeError: only length-1 arrays can be converted to Python scalars

Vil nogen derude hjælpe  med at rette denne kode????


Brugbart svar (0)

Svar #1
29. januar 2015 af hesch (Slettet)

#0:   Jeg ved ikke en pind om Python, men prøv linket:

https://www.google.com/search?q=python&ie=utf-8&oe=utf-8#q=python+only+length-1+arrays+can+be+converted+to+python+scalars

Fejlen tyder på, at der er uoverensstemmelse mellem to type-deklarationer.

Måske sætter du en skalar = et array ?


Brugbart svar (0)

Svar #2
30. januar 2015 af Jerslev

#0: Uden at have testet det, tror jeg, at der er et problem i og med, at du definerer x som et linspace og efterfølgende bruger x i en funktion. Kan funktionen selv finde ud af, at den skal tage hver værdi i dit array og gemme dem i et nyt array?

Ellers skal du lave en for-løkke, der kører hen over dine værdier i dit x-array og skriver til et nyt y-array den værdi, som f(x) har.

- - -

mvh

Jerslev


Brugbart svar (0)

Svar #3
31. januar 2015 af hesch (Slettet)

#1:  I linket fremkommer jo begrebet "stackoverflow". En sådan stak anvendes i adskillige programmeringssprog til at gemme bl.a. variabelværdier, variabelpointere og return-adresser.

Hvis du så pusher et array ved et funktionskald, og funktionen fx popper sidste element i stakken som parameter (funktionen skal kun bruge een parameter), står der en masse "crap" tilbage i stakken, som programmet ikke "ved" hvad det skal stille op med. Stakken bliver rent kaos, og hvis programmet pr. automatik checker staklængden, vil det opdage fejlen, der opfattes som netop "stackoverflow".

I programmeringssprog, hvor der anvendes en "compiler", vil denne opdage fejlen under compileringen, i form af fejlmeddelelsen: "Mismatched types" eller lignende. Men i programmeringssprog, der benytter en "interpreter", er skaden jo sket, inden den opdages, og fejlmeddelelsen bliver derfor af mere kryptisk karakter, for: "Hvad var det lige, der skete her ? ?"


Skriv et svar til: Trapezoidal rule: Integral i python

Du skal være logget ind, for at skrive et svar til dette spørgsmål. Klik her for at logge ind.
Har du ikke en bruger på Studieportalen.dk? Klik her for at oprette en bruger.