0
0

ラプラス変換で積分方程式に挑戦「(6-2)オンデマンド動画・2020年度東北大学工学部」をChatGPTとWolframAlphaとsympyでやってみたい。

Last updated at Posted at 2023-10-06
  • パイソニスタ?の方へ教えて下さい。。アドバイスをいただけると助かります。
    ①与式(多項式?)を+ーで分割する方法を教えて下さい。。xの有無で分けたいです。
    ②小数を分数に変換したいです。0.16666666666666666 →1/6  2023-10-23(済) ver0.3

オリジナル
>微分積分。両方混ざったとしても、ラプラス変換で計算することができます。(9:00)
>畳み込み積分があったとしても..cosとsinの...(9:04)
>留数定理をだすことができます。 (8:44)???
???私は、微分「サンビックリ」からです。???

ChatGPT-3.5先生へ(???できませんでした。???)

f'(t)-Integral(cos(t-s)*f(s),(s,0,t))=1

(省略)

積分方程式
f'(t)-Integral(cos(t-s)*f(s),(s,0,t))=1

...ただし、与えられた積分方程式は一般的に簡単に解ける形ではありません。...

sympyで

sympyのソースコードあり。(省略)
>このコードは、SymPyを使用して与えられた積分方程式を解き、簡略化した形で解を表示します。
過去に、1回目?で解けなくても,sympyで解ける場合がありました。

Mathematicaで

いつの日か、実行してみたい。

WolframAlphaで(できませんでした。)

標準の計算時間制限を超えました...

sympyで

Ver0.3 (自作関数myRldで小数を分数にしています。) 2023-10-23

# Ver0.3
from sympy import *
import re
var('s,p')
# var('t',nonnegative=True)   # Heaviside(t))がでます。
var('t',positive=True)
f,f1,F=map(Function,('f','f1','F'))
def myRld(f): # ver0.1
     li = re.findall(r'[.0-9]+',str(f))
     sorted_li=sorted(li ,key=lambda s:len(s))
     syosu    =sorted_li[-1]
     bunsu=Rational(sympify(syosu)).limit_denominator(10**12)
     return sympify( str(f).replace(str(syosu),str(bunsu)) )
def myLap(g):
     if   g==f1(t): return p*F(p)
     elif g==f(t):  return   F(p)
     else:          return laplace_transform(g,t,p)[0]
def myInvLap(g):
     return inverse_laplace_transform(g,p,t).evalf().simplify()
def mySol(eq):
     return Eq(f(t),myInvLap( solve(eq,F(p))[0])  )
eq =Eq(f1(t)-Integral(cos(t-s)*f(s),(s,0,t)),1)
eq0=Eq(f(0),0)
# 
eqF=Eq(myLap(f1(t))-myLap(cos(t))*myLap(f(t)),myLap(eq.rhs))
print("#",            eq   )
print("#",      mySol(eqF) )
print("#",myRld(mySol(eqF)))
print("#",8*" ",1/6,"1/6")
# Eq(f1(t) - Integral(f(s)*cos(s - t), (s, 0, t)), 1)
# Eq(f(t), 0.166666666666667*t**3 + t)
# Eq(f(t), t**3/6 + t)

旧Ver0.2 (pを使っています。F(p))

# Ver0.2
from sympy import *
var('s,p')
var('t',positive=True)
f,f1,F=map(Function,('f','f1','F'))
def myLap(g):
     if   g==f1(t): return p*F(p)
     elif g==f(t):  return   F(p)
     else:          return laplace_transform(g,t,p)[0]
def myInvLap(g):
     return inverse_laplace_transform(g,p,t).evalf().simplify()
def mySol(eq):
     return Eq(f(t),myInvLap( solve(eq,F(p))[0])  )
eq =Eq(f1(t)-Integral(cos(t-s)*f(s),(s,0,t)),1)
eq0=Eq(f(0),0)
# 
eqF=Eq(myLap(f1(t))-myLap(cos(t))*myLap(f(t)),myLap(eq.rhs))
print("#",eq)
print("#",mySol(eqF))
print("#",8*" ",1/6,"1/6")
# Eq(f1(t) - Integral(f(s)*cos(s - t), (s, 0, t)), 1)
# Eq(f(t), 0.166666666666667*t**3 + t)
#          0.16666666666666666 1/6

旧Ver0.1 (pを使っていません。sです。Y(s))

# Ver0.1
from sympy import *
var('x,s,t')
var('t',positive=True)
f,f1,y,y1,Y=map(Function,('f','f1','y','y1','Y'))
def myLap(g):
     if g==y1(t): return s*Y(s)
     if g==y(t) : return   Y(s)
     return laplace_transform(g,t,s)[0]
def myInvLap(g):
     if g==Y(s) :return y(t)
     return inverse_laplace_transform(g,s,t).evalf().simplify()
def myIntegrate(eq1):
     eq1=Eq(myLap(y1(t))-myLap(cos(t)) *myLap(y(t)),myLap(1)           ) # ;print("#1",eq1)
     eq2=Eq(Y(s)                                   ,solve(eq1,Y(s))[0] ) # ;print("#2",eq2)
     eq3=Eq(myInvLap(eq2.lhs)                      ,myInvLap(eq2.rhs)  ) # ;print("#3",eq3)
     return eq3
def myMain(eq,eq0):
     eq =eq.subs({f1(t):y1(t),f(s):y(s)})
     eqa=myIntegrate(eq)
     eqa=eqa.subs({y(t):(t)})
     return eqa
eq =Eq(f1(t)-Integral(cos(t-s)*f(s),(s,0,t)),1); eq0=Eq(f(0),0)
eqa=myMain(eq,eq0)
print("#",eq             )
print("#",eqa            )
print("#",8*" ",1/6,"1/6")

いつもの? sympyの実行環境と 参考のおすすめです。

(テンプレート)

いつもと違うおすすめです。

大学入試問題の過去問

0
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0