편집 기록

편집 기록
  • 프로필 엽토군님의 편집
    날짜2019.10.18

    안녕하세요 python 질문있습니다.


    이미지

    이미지

    두번째 사진에 ds=[] 부분 전까지는 공식 이용해서 s라는 리스트에 n-1개의 함수를 넣어놓는 과정입니다 이 과정까지는 전혀 문제 없음을 확인했어요..

    참고로 s 리스트에 들어있는 함수는 sympy에 Symbol 이용했구요.

    ds라는 리스트에 s 리스트 에있는 함수 미분한것을 저장하고 ho1에 s에있는 함수와 ds에 있는 도함수를 이용해서 함수의 겉넓이 공식에 대입해서 저장한 후 ho2에 ho1의 식을 전개한 값을 저장한 후 x라는 문자에 대해 x[i]부터 x[i+1]까지 적분한 값을 joy에 저장하는 코드입니다

    x라는 리스트에는 실수가 저장되어있구요

    정상적으로 작동한다면 joy 리스트에 숫자가 저장되어야 하는데

    x에 관한 식이 저장됩니다. 식 중간중간에 Integral이라는 명령어도 들어있고요

    왜 적분이 안되고 요상한 식이 저장되는건지 모르겠습니다 알려주세요..

    import numpy as np
    import sympy as sm
    import numpy.linalg as lin
    import matplotlib.pyplot as plt
    from math import pi
    
    n=int(input('입력할 점 갯수: '))
    z1=float(input('z1 값을 설정하세요: '))
    zn=float(input('zn 값을 설정하세요: '))
    x0=[]; y0=[]; s=[]; h=[]; c=[]; u=[0]; v=[0]; yy=[]
    
    for i in range(n):
        p,q=map(float, input().split())
        x0.append(p); y0.append(q) # n개의 점의 x,y값을 x0,y0에 저장
    
    for i in range(n-1):
        h.append(x0[i+1]-x0[i]) # h 생성
    
    for i in range(n-1):
        c.append((y0[i+1]-y0[i])/h[i]) # c 생성
    
    for i in range(n-2):
        u.append((h[i]+h[i+1])*2) # u 생성
    
    for i in range(n-2):
        v.append((c[i+1]-c[i])*6) # v 생성
    
    ar=[[0.0]*(n-2) for i in range(n-2)] # (n-2)(n-2)인 행렬 생성
    ar=np.array(ar)
    v.pop(0)
    br=np.array(v) # v를 행렬로 만들기
    
    for i in range(n-2):
        ar[i][i]=u[i+1]
    
    for i in range(n-3):
        ar[i][i+1]=h[i+1]
        ar[i+1][i]=h[i+1] #행렬에 값 집어넣기
    
    z=lin.solve(ar,br)
    z=list(z)
    z.insert(0,z1); z.insert(n-1,zn) #행렬 풀고 z1,zn 집어넣기
    
    
    for i in range(n-1):
        xx=sm.Symbol('x')
        y=((z[i+1]*(xx-x0[i])**3)+(z[i]*(x0[i+1]-xx)**3))/(6*h[i]) + ((y0[i+1]/h[i])-((h[i]*z[i+1])/6))*(xx-x0[i]) + ((y0[i]/h[i])-((h[i]*z[i])/6))*(x0[i+1]-xx)
        s.append(y) # 구간별 함수를 s에 추가
    
    
    for i in range(n-1):
        xs=np.arange(x0[i],x0[i+1]+0.001,0.001)
        yy.append(((z[i+1]*(xs-x0[i])**3)+(z[i]*(x0[i+1]-xs)**3))/(6*h[i]) + ((y0[i+1]/h[i])-((h[i]*z[i+1])/6))*(xs-x0[i]) + ((y0[i]/h[i])-((h[i]*z[i])/6))*(x0[i+1]-xs))
        plt.plot(xs,yy[i]) # 함수 그리기
    
    
  • 프로필 알 수 없는 사용자님의 편집
    날짜2019.10.17

    안녕하세요 python 질문있습니다.


    이미지

    이미지

    두번째 사진에 ds=[] 부분 전까지는 공식 이용해서 s라는 리스트에 n-1개의 함수를 넣어놓는 과정입니다 이 과정까지는 전혀 문제 없음을 확인했어요..

    참고로 s 리스트에 들어있는 함수는 sympy에 Symbol 이용했구요.

    ds라는 리스트에 s 리스트 에있는 함수 미분한것을 저장하고 ho1에 s에있는 함수와 ds에 있는 도함수를 이용해서 함수의 겉넓이 공식에 대입해서 저장한 후 ho2에 ho1의 식을 전개한 값을 저장한 후 x라는 문자에 대해 x[i]부터 x[i+1]까지 적분한 값을 joy에 저장하는 코드입니다

    x라는 리스트에는 실수가 저장되어있구요

    정상적으로 작동한다면 joy 리스트에 숫자가 저장되어야 하는데

    x에 관한 식이 저장됩니다. 식 중간중간에 Integral이라는 명령어도 들어있고요

    왜 적분이 안되고 요상한 식이 저장되는건지 모르겠습니다 알려주세요..

    import numpy as np import sympy as sm import numpy.linalg as lin import matplotlib.pyplot as plt from math import pi

    n=int(input('입력할 점 갯수: ')) z1=float(input('z1 값을 설정하세요: ')) zn=float(input('zn 값을 설정하세요: ')) x0=[]; y0=[]; s=[]; h=[]; c=[]; u=[0]; v=[0]; yy=[]

    for i in range(n): p,q=map(float, input().split()) x0.append(p); y0.append(q) # n개의 점의 x,y값을 x0,y0에 저장

    for i in range(n-1): h.append(x0[i+1]-x0[i]) # h 생성

    for i in range(n-1): c.append((y0[i+1]-y0[i])/h[i]) # c 생성

    for i in range(n-2): u.append((h[i]+h[i+1])*2) # u 생성

    for i in range(n-2): v.append((c[i+1]-c[i])*6) # v 생성

    ar=[[0.0]*(n-2) for i in range(n-2)] # (n-2)(n-2)인 행렬 생성 ar=np.array(ar) v.pop(0) br=np.array(v) # v를 행렬로 만들기

    for i in range(n-2): ar[i][i]=u[i+1]

    for i in range(n-3): ar[i][i+1]=h[i+1] ar[i+1][i]=h[i+1] #행렬에 값 집어넣기

    z=lin.solve(ar,br) z=list(z) z.insert(0,z1); z.insert(n-1,zn) #행렬 풀고 z1,zn 집어넣기

    for i in range(n-1): xx=sm.Symbol('x') y=((z[i+1](xx-x0[i])3)+(z[i](x0[i+1]-xx)*3))/(6*h[i]) + ((y0[i+1]/h[i])-((h[i]*z[i+1])/6))(xx-x0[i]) + ((y0[i]/h[i])-((h[i]z[i])/6))(x0[i+1]-xx) s.append(y) # 구간별 함수를 s에 추가

    for i in range(n-1): xs=np.arange(x0[i],x0[i+1]+0.001,0.001) yy.append(((z[i+1](xs-x0[i])3)+(z[i](x0[i+1]-xs)*3))/(6*h[i]) + ((y0[i+1]/h[i])-((h[i]*z[i+1])/6))(xs-x0[i]) + ((y0[i]/h[i])-((h[i]z[i])/6))(x0[i+1]-xs)) plt.plot(xs,yy[i]) # 함수 그리기