数値計算の演習問題で以下の二階微分方程式をルンゲ・クッタで解けという問題があります。

-y"+x^2・y=e・y(eは定数、”・”は単なる掛け算)

y(0)=1, y'(0)=0, 0<=x<=2までを計算せよ。



これは

y’=z・・・(1)
 
z'=(x^2-e)y・・・(2)

この2つの連立方程式を解けばよいところまではわかります。
まず(2)を解くときにルンゲ・クッタの場合
(k1+2k2+2k3+k4)/6の項(←公式の右辺第二項)のk(1~4)を求めなければいけません。

質問はkの求め方です。

本にはy'=f(x,y,z) , z'=g(x,y,z)とおけば
(2)の場合だと例えばk1は
k1=g(xn,yn,zn)dxで計算する。と書いてあります
しかしz'=(x^2-e)y(←zが入ってない) なので、計算すると
k1=g(xn,yn)dxとなってしまうんですがどうなんでしょう?

おそらくどこかで勘違いしてると思うんです。
長い質問になってしまいましたがどうかご教授のほどよろしくお願いします。

A 回答 (2件)

卒論で微分方程式の数値計算をやったので多少の覚えはあります。

結局僕の場合はy'の項が入ってるのでリープフロッグの方が収束が早いという事でそっちにしましたが。

> k1=g(xn,yn)dxとなってしまうんですがどうなんでしょう?

問題ありません。

> 本にはy'=f(x,y,z) , z'=g(x,y,z)とおけば

というのはy', z'がx,y,zの関数という一般の場合であり、仮に
f(x, y, z) = x + y
という関数が存在しても何の問題もないのと同じです。

k1を計算する際にも
k1 = (x^2 - e)y * dx
と値が一意に決まり、問題ないでしょう。

ちなみにこの程度の微分方程式なら刻み幅dxにも寄りますが、プログラムなど組まなくてもExcelで一発で出ますよ。グラフも。
    • good
    • 0
この回答へのお礼

どうもありがとうございます。
もしかしたら私は勘違いしてるんじゃないかと思ってたので・・
しつこく質問してしまいすいませんでした。

お礼日時:2001/07/07 03:53

良いと思いますよ。


ちなみに、私は、dx=hとして、
k1=f(x,y,z)・h
l1=g(x,y,z)・h
k2=f(x+h/2,y+k1/2,z+l1/2)・h
l2=g(x+h/2,y+k1/2,z+l1/2)・h
k3=f(x+h/2,y+k2/2,z+l2/2)・h
l3=g(x+h/2,y+k2/2,z+l2/2)・h
k4=f(x+h,y+k3,z+l3)・h
l4=g(x+h,y+k3,z+l3)・h
としてプログラムを書きました。
    • good
    • 0
この回答へのお礼

どうもありがとうございます。
同じ問題やられてたんですか(笑)
お答えの中で
k1=f(x,y,z)・h
l1=g(x,y,z)・h
とありますが
実際プログラムで計算するとき
f(x,y,z)の中身は
f(x,y,z)=z

g(x,y,z)の中身は
g(x,y,z)=(x^2-e)・y
ということでいいんですか?

って何がいいたいかと言うと
例えばg(x,y,z)・hを実際に計算する場合、
g(x,y,z)=(x^2-e)・y
に変数(xとy)に数を代入して計算しますよね。
その場合g(x,y,z)(←zが入っている)にはどこにもzを代入する
ところがないんですがg(x,y,z)と記述するのは単に形式的なものと
考えていいんですか?

お礼日時:2001/07/06 00:30

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qルンゲクッタ法について

ルンゲクッタ法についての問題なのですがよくわかりません。

常微分方程式 du/dt=u について、ルンゲクッタ法(3次.4次)による誤差分析を行えという問題です。

Aベストアンサー

呆れた。それを他人にやらすんですか?

dy/dx = f(x,y) に対するルンゲ・クッタ法
  k1 = h f(x0, y0)
  k2 = h f(x0 + h/2, y0 + k1 /2)
  k3 = h f(x0 + h/2, y0 + k2 /2)
  k4 = h f(x0 + h, y0 + k3)
  k = (k1 + 2 k2 + 2 k3 + k4)/6
  y1 = y0 + k


du/dt = u に適用すると、
  k1 = h u0
  k2 = h (u0 + k1 /2)
  k3 = h (u0 + k2 /2)
  k4 = h (y0 + k3)
  k = (k1 + 2 k2 + 2 k3 + k4)/6
  u1 = u0 + k
で、

ここから k1,k2,k3,k4,k を代入消去すると、
u1 = u0 + (k1 + 2 k2 + 2 k3 + k4)/6
   = u0 + (k1 + 2 k2 + 2 k3 + h (y0 + k3))/6
   = u0 + (k1 + 2 k2 + 2 h (u0 + k2 /2) + h (y0 + h (u0 + k2 /2)))/6
   = u0 + (k1 + 2 h (u0 + k1 /2) + 2 h (u0 + h (u0 + k1 /2) /2) + h (y0 + h (u0 + h (u0 + k1 /2) /2)))/6
   = u0 + (h u0 + 2 h (u0 + h u0 /2) + 2 h (u0 + h (u0 + h u0 /2) /2) + h (y0 + h (u0 + h (u0 + h u0 /2) /2)))/6

展開整理すると、
   u1 = u0{1 + h + (1/2)h^2 + (1/6)h^2 + (1/24)h^4}
になります。

多項式の整理は、自分でやってください。

呆れた。それを他人にやらすんですか?

dy/dx = f(x,y) に対するルンゲ・クッタ法
  k1 = h f(x0, y0)
  k2 = h f(x0 + h/2, y0 + k1 /2)
  k3 = h f(x0 + h/2, y0 + k2 /2)
  k4 = h f(x0 + h, y0 + k3)
  k = (k1 + 2 k2 + 2 k3 + k4)/6
  y1 = y0 + k


du/dt = u に適用すると、
  k1 = h u0
  k2 = h (u0 + k1 /2)
  k3 = h (u0 + k2 /2)
  k4 = h (y0 + k3)
  k = (k1 + 2 k2 + 2 k3 + k4)/6
  u1 = u0 + k
で、

ここから k1,k2,k3,k4,k を代入消去すると、
u1 = u0 + (k1 + ...続きを読む

Qx1=(1,1,1),x2=(1,1,-1),x3=(1,-1,-1)をC^3の基底,{y1,y2,y3}がその双対基底でx=(0,1,0)の時,y1(x),y

[問] ベクトルx1=(1,1,1),x2=(1,1,-1),x3=(1,-1,-1)をC^3の基底とする。
{y1,y2,y3}がその双対基底でx=(0,1,0)の時、
y1(x),y2(x),y3(x)を求めよ。

という問題の解き方をお教え下さい。

双対基底とは
{f;fはF線形空間VからFへの線形写像}
という集合(これをV*と置く)において、
V(dimV=nとする)の一組基底を{v1,v2,…,vn}とすると
fi(vj)=δij(:クロネッカーのデルタ)で定めるV*の部分集合
{f1,f2,…,fn}はV*の基底となる。これを{v1,v2,…,vn}の双対基底と呼ぶ。

まず、
C^3の次元は6(C^3の基底は(1,0,0),(0,1,0),(0,0,1),(i,0,0),(0,i,0),(0,0,i))
だと思うので上記のx1,x2,x3は基底として不足してると思うのです(もう3ベクトル必要?)。

うーん、どのようにしたらいいのでしょうか?

Aベストアンサー

>C^3の次元は6(

これが間違え.
「x1=(1,1,1),x2=(1,1,-1),x3=(1,-1,-1)をC^3の基底」
といってるんだから,係数体はRではなく,C.

あとは定義にしたがって,
dualな基底を書き下せばいいだけ.
y1(x1)=1,y1(x2)=y1(x3)=0であって
v=ax1+bx2+cx2と表わせるわけだし,
v=(v1,v2,v3)とすれば,a,b,cはv1,v2,v3で表現できる
#単なる基底変換の問題.

QXcodeでのc言語のプログクムについて。

Xcodeでのc言語のプログクムについて。

ルンゲークッタ法のプログラムを書いているのですがビルドエラーになってしまい、原因が分かりません。
 ビルド結果は、
"_func",referenced from:
_main in main.o
"_dvector",referenced from:
_main in main.o
_rk4 in main.o
symbol(s) not found
collect2: ld returned 1 exit status

 プログラムは、
#include <stdio.h>
#include <stdlib.h>

double *dvector(long i, long j); /* ベクトル量領域の確保*/
void free_dvector(double *a, long i); /* 領域の解放*/
double func(double x, double y); /* 関数の定義 */
/* ルンゲークッタ法 */
double *rk4( double y0, double a, double b, int n, double (*f)());

int main (void)
{
double *y, h, a=0.0, b=1.0, y0=1.0 ;
int i, n;

printf("分割式を入力してください-->");
scanf("%d",&n);

y = dvector( 0, n );/*領域の確保*/
y = rk4( y0, a, b, n, func );/*ルンゲクッタ法*/

/* 結果の表示 */
h = (b-a)/n ;/* 刻み幅 */
for (i = 0 ; i <= n ; i++)
{
printf("x=%f \t y=%f \n", a+i*h, y[i] );
}

return 0;
}

/* ルンゲクッタ法 */
double *rk4( double y0, double a, double b, int n, double (*f)() )

{
double k1, k2, k3, k4, h, *y, x;
int i;
y = dvector( 0, n );/* y[0,1,....,n]の確保 */
h = (b-a)/n ;

/* 初期値の設定 */
y[0] = y0; x = a;

/* ルンゲクッタ法 */
for ( i = 0 ; i < n ; i++)
{
k1 = f(x,y[i]); k2 = f(x+h/2.0, y[i]+h*k1/2.0);
k3 = f(x+h/2.0, y[i]+h*k2/2.0);
k4 = f(x+h, y[i]+h*k3);
y[i+1] = y[i] + h/6.0 * ( k1 + 2.0*k2 + 2.0*k3 + k4 );
x += y[i];
}

return y;
free_dvector(y, 0); /* 領域の解放 */
}

Xcodeでのc言語のプログクムについて。

ルンゲークッタ法のプログラムを書いているのですがビルドエラーになってしまい、原因が分かりません。
 ビルド結果は、
"_func",referenced from:
_main in main.o
"_dvector",referenced from:
_main in main.o
_rk4 in main.o
symbol(s) not found
collect2: ld returned 1 exit status

 プログラムは、
#include <stdio.h>
#include <stdlib.h>

double *dvector(long i, long j); /* ベクトル量領域の確保*/
void free_dvector(double *a, long i); /* 領域の解...続きを読む

Aベストアンサー

> y = dvector( 0, n );/*領域の確保*/
> y = rk4( y0, a, b, n, func );/*ルンゲクッタ法*/
> y = dvector( 0, n );/* y[0,1,....,n]の確保 */
> この部分が、関数の実体なのだと思うのですが、、、
 
 これは関数を呼び出してる部分です。
 呼んだ関数の実体(関数の処理が書かれているコード)がどこかにないといけません。
 
 一般的なライブラリ関数なら該当するライブラリをリンクすれば良いのですが、ソース中に直にプロトタイプ宣言が書かれているということはユーザー定義の関数かと思われますので、その関数のソースコードがどこかになくてはいけません。
 元のソースをネットなり書籍なりのどここから引っ張ってきたのなら、その近くにあるのかもしれませんので探してください。

Qx+y+z=0,2x^2+2y^2-z^2=0のとき,x=yであることを証明せよ。

クリックありがとうございます(∩´∀`)∩

 ★x+y+z=0,2x^2+2y^2-z^2=0のとき,x=yであることを証明せよ。

この問題について説明をお願いします。

Aベストアンサー

おおざっぱな説明になりますが、左の式を
z=-x-y
として、それを右の式のzに代入します。
それを展開してまとめると
x^2-2xy+y^2=0
という式になります。
あとはこれを因数分解すれば
(x-y)^2=0
となるので、x=yという答えがでます。
与えられた条件がほかになければこれでいいはずです。

Q微分方程式をルンゲクッタ法を用いて解くプログラム

2*(y''(x))+0.5(y'(x))+2.5y=1
Y(0)=0.1,y'(0)=0.1
この微分方程式をルンゲクッタ法を用いて、
x軸が0から50位(0.01刻み)までのyの値を算出するプログラムを作りたいのですが、どうすればいいのかさっぱり分かりません。
ネットで色々と調べてみたのですが、ルンゲクッタ法をどうやってプログラムで表せば良いのかが分かりません。
どうか、回答をよろしくお願いします。

Aベストアンサー

もし学校の課題なら自分で考えないと自分の将来のためによくないよ。
そうでないなら、基本はここで十分でしょう。
http://www.damp.tottori-u.ac.jp/%7Eooshida/edu/ode/
サンプルソフトが欲しければ、ここ。
http://www.unige.ch/math/folks/hairer/software.html

Q点(X0,Y0),(X1,Y1),…,(Xn,Yn)を通るn次関数がただ一つであることの証明

n次関数の証明なのですが、
「因数定理を用いて、点(X0,Y0),(X1,Y1),…,(Xn,Yn)を通るn次関数がただ一つであることを証明せよ」という問題です。

ラグランジュの補間公式の証明みたいなのですが、ただ一つであることを証明する方法がわからなくて困っています。

具体的な考え方でもよいので、アドバイスいて頂けると嬉しいです。
よろしくお願いします

Aベストアンサー

 因数定理とどうつながるか、考えた事はないですが、実用的に考えれば、
  y=Σa(j)*x^(n-j)
において(j=0~n)、(x(i),y(i))を代入すれば(i=0~n)、
  Σa(j)*x(i)^(n-j)=y(i)
  i,j=0~n
と、a(j)に関する連立方程式になるので、解が存在すれば一意です。

 解の存在は「因数定理から」という事になるんでしょうかね?。

Qルンゲクッタ法の中でも,もっとも精度の良い方法を教えてください.

ルンゲクッタ法の中でも,もっとも精度の良い方法を教えてください.
よろしくお願いします.
名称だけでいいのでお願いします.
できるだけ、早急な回答をよろしくお願いいたします。

Aベストアンサー

次数で分類されますが、よほどガタガタした解軌道を予想するのでない限り、3次か4次で充分です。5次以上にしても、有効桁数の工夫をしない限り殆どご利益はありません。

Qy,z∈V'(Vの線形写像全体の集合)[x,y]=0→[x,z]=0は∃α∋z=αyを意味する事を示せ。

おはようございます。

[Q] Prove the following statement:
Let y,z∈V'(set of all linear functionals on V) [x,y]=0→[x,z]=0 implies that ∃α∋z=αy.

という問題に悪戦苦闘しています。
linear functionalは線形汎写像(終集合がRやCの線形写像)の意味。

この問題はつまり、
"y(x)=0⇒z(x)=0"が成立するならば
線形写像z:V→R(or C) はαyという写像(zはyのスカラー倍になっているような線形写像)。
つまり、
V∋∀x→z(x):=α(y(x))という写像
である事を示せ。
という意味だと解釈しています(勘違いしておりましたらご指摘ください)。
その場合,どのように証明すればよいのでしょうか?

Aベストアンサー

#1です。
>>V≠Ker(y)の時はα:=z(x_0)/y(x_0)と採れば
∀x∈Vに対し、
x∈Ker(y)ならz(x)=0且つy(x)=αz(x)=α・0 (∵仮定) =0となるのでy=zでOK。
x∈V\Ker(y)ならz(x)=(z(x_0)/y(x_0))y(x)=???=y(x)
何故か
z(x)=y(x)が言えません。

z=yではなくz=αyとしてるので問題は無いように思いますが。

Qルンゲクッタ法の誤差

初歩的な質問ですが、ルンゲクッタ法は4次がよく使われて、その誤差はh^5オーダーと聞きます。
誤差の次数が大きい方が近似精度が悪いように見えるんですが、この部分はどういうことなのでしょうか?

Aベストアンサー

ちょいとコメントしておくと, #1 のいうような「解析範囲の1/100とか1/1000ぐらい」は不正確です. 「解析範囲」が大きすぎるとやっぱり h が 1 より大きくなっちゃって困るからね.

実際には, h の値そのものがそれなりに小さくないとダメです. ただし, あまりにも小さくしすぎると今度は計算誤差が積ってくるので問題になることに注意.

Qx>0,y>0,z>0 で、x^2+y^2+z^2=a^2のとき、

x>0,y>0,z>0 で、x^2+y^2+z^2=a^2のとき、
xy+yz+zxの最大値を求めよ。

コーシーシュワルツの不等式を使うとでるとおもうが、
別解での解答はどうなるのか。よろしくお願いします。

Aベストアンサー

どういう風にシュワルツを使うのか。。。。。w
そんな仰々しいものを持ち出さなくても、教科書に載ってる不等式(絶対不等式)で用が足りる。



x、y、zは実数から、x^2+y^2+z^2≧xy+yz+zx で終わり。
等号は、x>0,y>0,z>0から、x=y=z=a/√3の時。


人気Q&Aランキング

おすすめ情報