• ベストアンサー

画像変換の高速化

DOS/VマシンでMicrosoft C Ver6.0でCの勉強をしています。 初心者の入り口レベルなので、質問の内容が拙いかもしれませんが、よろしくお願いします。 BMPの8ビット形式の画像を任意のデータに変換するプログラムを作ったのですが、処理速度がとても遅く(1.7M位で5分30秒かかりました)何とか高速化をしたいと思います。 今やっているやり方はX方向分(ファイルサイズをYサイズで割ったもの)のバッファを取り、書込む時に実際のX方向分のみ書き込ませる。 をY方向分繰返すという処理です。 絶対もっと早くなる方法があるはずだと思うのですが、いくら考えても全く分かりません。 アドバイスをよろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • titokani
  • ベストアンサー率19% (341/1726)
回答No.6

>いえ、えーと書き方が悪かったようで、マイクロソフトC のVer6 です。 あ、なるほど、こちらでしたか。失礼しました。 でしたら16bit環境ですね。 16bit環境では、CreateFileMappingは使えないですね。 あと、メモリも最大で640KBですから、ファイルを全部メモリに読み込みのも無理です。 メモリをできるだけ確保して、数十ラインづつまとめて処理すれば、それなりに早くなるかもしれません。 あるいは実体がWindows98ということですから、32bit環境で動かすこともできるかもしれません。このほうが搭載されているメモリを有効に使えますね。

siriusu-1
質問者

お礼

お忙しい中、何度もご回答ありがとうございます >数十ラインづつまとめて処理すれば、それなりに早くなるかもしれません ファイルサイズによって、ライン数を変えるような作り方に変更してみます。 とても参考になりました。 もう一度BMPフォーマットを見直して、1ラインづつ読まなくても上手く処理できるように工夫してみます。 BMPは4バイトづつデータを取って行くので、最後のデータに0~3の余りが出てしまい、それの処理をするのに1ラインずつ読んでいました。 これからは一度にたくさんのラインを読んで処理したのち書き込むように考えてみます。

その他の回答 (6)

  • titokani
  • ベストアンサー率19% (341/1726)
回答No.7

とりあえず、メモリを最大限確保したうえで、単なるファイルコピーを作ってみましょう。 それで早くなるようなら望みはあります。 早くならないようなら、別の方法を模索したほうがいいでしょう。

siriusu-1
質問者

お礼

ありがとうございました。 方向性が決まり現在今メモリの取り方について一から考え直す方向で考えております。 色々アドバイスを頂きありがとうございました。

  • titokani
  • ベストアンサー率19% (341/1726)
回答No.5

>で書き込みメディアがCFです CF上で作業していたら、そんなスピードかもしれません。 試しに、CF上でファイルのコピーを行うとどのくらいかかるでしょうか? もし、ファイルをコピーするだけでも5分程度かかるのであれば、なにをどう頑張ってもそれ以上早い処理は不可能です。 以後は余談なのですが、 >今はPC Dosの環境で作業しております。 PC Dosというと、16ビット環境になります。 VC++6で16ビット環境の開発はできませんから、どちらかに勘違いがあると思います。 普通、Windows2000とかXPとかで使われる、DOSのような画面は、「コマンドプロンプト」と呼びます。 でも、 >CPUインテルPentium3(クロックはちょっと分かりません) ということから、本当にPC-DOSである可能性も捨てきれず・・。 PC-DOSでVC++6.0は動かないから、クロス開発? でも、PC-DOSにCFのドライバなんてあったかな??

siriusu-1
質問者

補足

お返事ありがとうございます。 >PC-DOSでVC++6.0は動かないから、クロス開発? いえ、えーと書き方が悪かったようで、マイクロソフトC のVer6 です。 >でも、PC-DOSにCFのドライバなんてあったかな?? よく分からないのですが、Windows98のPCを改造してPC-DOSマシンにしてあるらしく、CFが使えるようになっています。 Microsoft Visual C++ 2005の環境もあります。(ただ、全く勉強をしていないので使えないのですが) >試しに、CF上でファイルのコピーを行うとどのくらいかかるでしょうか? 同じものをコピーして5秒程でした。 かなり凹んでます。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.4

私も #3 と同じく「1.7MB の読み書き」に 5分もかかるとは思えないです. ハードディスクだとしたらあまりにも遅すぎ. そんな状況だと, CreateFileMapping (Unix なら mmap) を使っても「劇的に」速くなることはないような気がします. この辺はファイルアクセスの際のバッファリングに関係するんだけど, fread でデータを読み込むと最悪 1.OS のバッファ 2.C のライブラリのバッファ 3.ユーザが確保したバッファ の 3つのバッファをデータが通る可能性があります. つまり, 2回もデータをコピーしないといけないわけです. ところが, CreateFileMapping なり mmap なりを使うと2と3をすっとばすことができます. だから速くなる (かもしれない) というわけ. でも, 今の場合は「そもそもディスク (?) からのアクセスが遅い」ような気がするので無意味かなぁ.... まあ, Windows や Unix など*特定の OS を想定しない*のなら, #1 で言われる通り「fread/fwrite のバッファを大きくとる」のが最初かな.

siriusu-1
質問者

お礼

丁寧なご回答ありがとうございます。 3つもバッファが有るんですね。初めて知りました。 そしてそれ全てを通る場合と通らない場合があると言うのもビックリしました。 自分のファイルアクセスがどのようになっているのか、全く分からない状況なのでハッキリした事は言えませんが、もしかするとCF(コンパクトフラッシュ)とのやり取りに問題があるのかもしれません。 出来ればハードに入れて試したいのですが・・・ハードが無い状態なので・・・・・・・・・(有り得ない状態なのですが本当に無いです) ※書いている自分も信じられなくて何度も何度も確認した位です(苦笑) この環境で作る事事態間違っていると思うのですが、CFで乗り気らなければならない状態です(ちなみにCFは256Mです) 一旦Dosでのプログラムは一時中止して、上司の指示を仰ぎます。 大変勉強になりました。ありがとうございます。

  • titokani
  • ベストアンサー率19% (341/1726)
回答No.3

>for(i=1; i <= y_size; i++) { >fread(callo_mem,x,1,BMP_fp); >fwrite(callo_mem,x_size,1,T_fp); >} >の分だけで5分かかっておりました。他の部分は30秒程度です。 いくらなんでも5分もかかるかな。x_size,y_sizeの値はいくらですか? あと、CPUクロック、メモリサイズ、メディア種類などもお願いします。

siriusu-1
質問者

補足

ご回答ありがとうございます。 CPUインテルPentium3(クロックはちょっと分かりません) メモリサイズは256 で書き込みメディアがCFです 今回使用した画像はx=2000でy=8400です 多分その逆だとかなり早くなるとは思います。 今はPC Dosの環境で作業しております。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

まず最初にやるべきは「どこに時間がかかっているのか」を明らかにすることなんですが, それは OK なんですか? 例えば, 「実際の処理の時間に比べてファイルの読み書きが明らかにオーバヘッドになっている」とかいうことがわかっているんでしょうか? そこをごりごりやるなら #1 で言われる通り「読み書きの回数をなるべく減らす」ことでしょうね. Windows でいくという覚悟 (と十分なメモリ) があれば CreateFileMapping を使うとおそらく最速.

siriusu-1
質問者

お礼

ご回答ありがとうございます。 >「どこに時間がかかっているのか」 php504様の補足にも書かせて頂いた for(i=1; i <= y_size; i++) { fread(callo_mem,x,1,BMP_fp); fwrite(callo_mem,x_size,1,T_fp); } の分だけで5分かかっておりました。他の部分は30秒程度です。 30秒も長いので他の方法を模索するつもりですが、一番の原因である読み書きの部分を何とかしないとダメだと思います。 >「読み書きの回数をなるべく減らす」 読み書きどちらかが遅いというわけでなく、どちらも遅いという事なんですね。なのでどちらも回数を減らす方向で作り替えなければならない という事ですね。 >CreateFileMapping ちょっと知らない言葉ですが、Windowsならこれを使うと劇的に処理が速くなるのですね。 Windows版も視野に入れていますので調べてみます。 アドバイスありがとうございます。

  • php504
  • ベストアンサー率42% (926/2160)
回答No.1

実際のソースを見ないとわからないです ファイルの入出力を1ラインごとにやっているのなら遅くなる原因の一つにはなるでしょう メモリが十分なら画像を全部読み込み->変換処理->画像をまとめて書き込みにすればファイルの入出力の回数は1回ずつですみます。

siriusu-1
質問者

補足

素早いご回答ありがとうございます。 >ファイルの入出力を1ラインごとにやっているのなら遅くなる原因の一つにはなるでしょう やはりそうですか・・・。 今はXサイズを1ラインと考えて入出力を繰り返しております。 for(i=1; i <= y_size; i++) { fread(callo_mem,x,1,BMP_fp); fwrite(callo_mem,x_size,1,T_fp); } 画像のサイズがまちまちなのでその辺をどうしたらいいのか分からず悩んでおります。(40M以上の画像というものがあったので・・・) 処理速度を上げる場合、一気にバッファに貯めてから処理をするというのが早くなる方法ですか? 読みと書きどちらの方が遅くなるのですか? それともどちらも同じ位の処理時間なのでしょうか? すみません質問攻めで・・・。

関連するQ&A

  • C#にて、イメージ画像の分割

    C#言語にて現在パズルゲームを作成しようと考えています。 パズルに使用するピースですが、ユーザが任意に選択した画像をプログラミングで規定の画像サイズに切り出し、それをパズルピースとして使用する仕様を考えています。 ファイルを開くボタン押下で、OpenFileDialogを表示し、ユーザに任意のイメージ画像を選択させます。その選択された画像を58pixcelx58pixcelのサイズの画像を9x6の54枚(パズルピース)に分割します。 以下がその仕様を考えたソースコードです。 private void selectButton_Click(object sender, EventArgs e) { OpenFileDialog openFileDialog = new OpenFileDialog(); if (openFileDialog.ShowDialog() == DialogResult.OK) imageShow(openFileDialog.FileName); } private void imageShow(string filePath) { Bitmap _bmp = new Bitmap(58, 58); Image originalImage = Image.FromFile(filePath); Graphics g = Graphics.FromImage(_bmp); Rectangle rect; int x = 0; int y = 0; string title = "C:\\Image"; int index = 0; for (x = 0; x < 9; x++) { for (y = 0; y < 6; y++) { index++; rect = new Rectangle((x * 58) , (58 * y), 58, 58); g.DrawImage(originalImage, 0, 0, rect, GraphicsUnit.Pixel); _bmp.Save(title + index.ToString()+ ".jpg",System.Drawing.Imaging.ImageFormat.Jpeg); Thread.Sleep(50); } y = 0; } } パズルピースとして使用する予定のサイズ58x58のBitmapを作成します。そのBitmapからGraphicsを作成し、Graphicsに対してDrawImageでオリジナル画像(ユーザが選択した画像)を58Pixcelごとに分割し、分割されて作成されたImageをSave()にてファイル保存しています。 この仕様で一応ファイルは分割されて作成されるのですが、どうも画像の位置が合わないのです。画質も悪いですし。手動で同じオリジナルファイルを58Pixcelごとに切り出したものと比較しますと顕著にちがいます。 何か足りない処理や、他の対応策がございましたらご教授のほどよろしくお願いいたします。今回の仕様で、切り出したファイルをローカルマシンに保存する、と言うのは必須事項になっております。 どうか皆様よろしくお願いいたします。

  • C++ Builderにおける画像データの取得について

    C++での画像処理プログラムの研究をしている者です。 文字数制限がありますので簡潔になりますがよろしくお願いします。 担当教官から基本となるプログラムをいただいたのですが実行するとエラーが出てしまいます。 プログラム内容: void TImg::ImgMemToBmp(Graphics::TBitmap *bmp, BYTE *img) { GetBmpHdr(); // ビットマップヘッダー取得 String fileName = StartDir + "\\tmp.bmp"; FILE *fp;if (NULL == (fp = fopen(fileName.c_str(), "wb"))) return; fwrite(BmpHeader, 54, 1, fp); // ヘッダー //******** 画像書き込み ******** BYTE *p, *img1 = (BYTE *)malloc(Pixel_X_Max*3); for (int y=0; y<Pixel_Y_Max; y++) { p = img + (Pixel_Y_Max-y-1) * Pixel_X_Max; for (int x=0; x<Pixel_X_Max; x++) { *(img1+3*x) = *(img1+3*x+1) = *(img1+3*x+2) = *(p+x); } fwrite(img1, Pixel_X_Max*3, 1, fp); } fclose(fp); bmp->LoadFromFile(fileName); // BMPファイル読み込み DeleteFile(fileName); free(img1); // 不要ファイル、メモリ削除 } 問題点:下から3行目の bmp->LoadFromFile(fileName); でクラスの例外が発生しました。"ビットマップが不正です"とのエラーが出ます。 私なりにプログラムを解析してみたところ で、tmp.bmpというファイルを作りそこに白黒画素値を書き込んでいるように思うのですが 途中で止めてtmp.bmpのサイズを確認してみたところ 原画像が640×480の画像でtmp.bmpのサイズは20971840×15728640となっていました。 これが原因でエラーと出たのではないかと考えたのですがいかがでしょうか? 補足要求していただければ、適宜補足いたしますので どうかご助力をよろしくお願いいたします。

  • より高速な画像の表示法

    医療画像(DICOM)のバイナリデータを読み込んで表示させるプログラムを作っているのですが、非常に遅い(約4秒)ので改善したいのです。 おそらく、ループ中での、エンディアンの変換とPixelへの張付けが原因と思うのですが、改善方法が判りません。宜しくお願いします。 BolandC++Builder6,Pentiam4,1Gメモリ,XPの環境です。 DICOMO画像のファイルサイズは約2053kB 画像データは1024*1024の16ビットです。 __________________________________ Byte bb[2097152]; int iImage[512][512]; word c,wData; fp=fopen("filename","rb"); setvbuf(fp,NULL,_IOFBF,4096*1024*1024); while(gData!=0xE07F) //グループタグの検索// fread(& gData,2,1,fp); while(eData!=0x1000) //エレメントタグの検索// freadd(& eData,2,1,fp); fread(&wData,2,4,fp); //空読み// fread(bb,1,2097152,fp); //画像データ// fclose(fp); for(y=0;y<=512;y++){ for(x=0;x<=512;x++){ wData=256*bb[4*x+4096*y]+bb[4*x+4096*y+1]; c=wData*256/4096; iImage[x][y]=c; Image->Canvas->Pixels[x][y]=(TColor)((c<<16)|(c<<8)|c); c=0; } }

  • BMP画像を画像処理して連続に表示したいですが?

    プログラミングの初心者ですが、現在VC++2005のフォームアプリケーションでプログラムについて勉強しています。画像を連続表示するところで、わからなくなってしまったので、みなさんのご指導お願いいたします。 やりたい処理は、取り込んだ画像の色を変化させて、順番に表示したい 処理です。作成したプログラムは下記のようになります。 前略 for(n=0; n<256; n+=20){ for(y=0; y<480; y++){ for(x=0; y<640; x++){ bmp->Setpixel(x, y, Color::FromArgb(n, n, n)); } } pictureBox->Image = bmp; Thread::Sleep(2000); } nの値をbmpに入れてから一回表示し、さらにnを足してからbmpに入れて表示するといった流れですが、Sleepを入れても何にも表示されません。 どういったところは不具合なのかをよくわかりません。 ご指導をいただければ感謝致します。どうぞよろしくお願い致します。

  • クリックした位置に画像を貼り付ける方法

    開発環境はWinXP、C++、MFCを使っています。 C++を勉強し始めた初心者です。 画面上で左クリックされた位置に画像(ビットマップ画像)を表示させる簡易プログラムを作ろうとしています。 ここで、マウスの位置を取得する方法がわかりません。理解しやすい方法があれば押してください。 ちなみにこんな感じでつくってます。。。↓ void Canvas::MakeStamp() //Canvas ・MaskStamp共に任意の名前 { // //ここでマウスの位置を取得したいです // //画像を貼り付け CClientDC cdc(this); CDC bmpCDC; bmpCDC.CreateCompatibleDC(&cdc); CBitmap bmp; bmp.LoadBitmap(STAMP); //STAMPは任意の名前 bmpCDC.SelectObject(bmp); cdc.BitBlt(X,Y,60,60,&bmpCDC,0,0,SRCCOPY); //ここのX,Yはクリックした座標を当てはめるつもりです。 } よろしくお願いします。

  • 行列 1次変換

    次の平面上の変換は1次変換か否かを調べ、1次変換であるもの については、1次変換を表す行列を求めよ。 (1)平面上の任意の点Pに点Pを対応させる変換(恒等変換) (2)点P(x、y)をx軸方向に2、y軸方向に-1だけ平行移動した点を P’(x’、y’)とする変換 (3)点P(x、y)を原点を中心に角π/3だけ回転させた点をP’(x’、y’) とする変換 この三つの問題なんですが (1)は恒等変換なので (x’)=(1 0)(x)=(x) (y’)=(0 1)(y)=(y)  (2段で書いていますが1段と考えて) でよいですか? あとの二つはわかりません。お願いします。

  • Octave画像ファイルの向きを上下逆さまにしたい

    % lec5_2.m % bmp画像出力(画像*****のプログラム) % % Input.bmp : 処理したい画像(モノクロ)BMPファイル % Output.bmp : 処理したい画像(モノクロ)BMPファイル clear all, close all % おまじない Iin=imread('LENNA.bmp'); % 画像の入力 figure, imshow(Iin) % 画像表示 [y_size,x_size]=size(Iin); %縦横のサイズ % 配布資料を参考にして以下の2重for文の % 中のプログラムを完成させよ for n=3:y_size for m=3:x_size n2=y_size-n+1; Iout(n,m)=Iin(n2,m); end end % プログラム修正ここまで figure, imshow(Iout) % 画像表示 bmpwrite_bk(Iout,'LENNA.bmp','Output.bmp'); % End of file 上記はOctaveのmファイルの中身ですが、これを使用すると画像の上下を反転させることができます。 これを、『画像を上下逆さまに回転』させ、元の画像を下向きにして表示させたいです。それをするには二重for文の内容を変えるみたいなのですが、どう変えればいいかわからず途方に暮れています。 二重for文の内容をどう変えたら成功するのでしょうか。 mファイルをどう弄ったらいいかもわからない初心者の質問です。よろしくお願いします。

  • UWSCのスクリプトについて

    画像Dを認識したら画面上に画像Bがあっても 処理Bを実行しない為にはどうしたら良いでしょうか。 -------- while True BTN(LEFT,click,150,10,110)   //処理A Sleep(2) ifb CHKIMG("A.bmp")    x=G_IMG_X            y=G_IMG_Y BTN(left,click,x,y,110) Sleep(1.5) endif Ifb ChkImg("B.bmp")       //処理B BTN(LEFT,click,1120,90,110) Sleep(1) KBD(VK_return,DOWN,30) endif ifb CHKIMG("C.bmp")      //処理C x=G_IMG_X            y=G_IMG_Y BTN(left,click,x,y,110) Sleep(1.5) wend --------

  • 複数枚画像の合成

    こんにちわ、Visual Studio 2005のフォームアプリケーションでプログラミングしているものです。複数枚の画像を一つの画像にしたいのですが、どうもあっているのかどうかわかりません。 たとえば、画像が9枚あって1枚目の一番左上の画素を[0-0,0]とすると、 [0-0,0][1-0,0][2-0,0]|[3-1,0][4-1,0][5-1,0]|[6-2,0][7-2,0][8-2,0] [0-0,0][1-0,0][2-0,0]|[3-1,0][4-1,0][5-1,0]|[6-2,0][7-2,0][8-2,0] [3-0,0][4-0,0][5-0,0]|[6-1,0][7-1,0][8-1,0]|[0-2,0][1-2,0][2-2,0] [3-0,0][4-0,0][5-0,0]|[6-1,0][7-1,0][8-1,0]|[0-2,0][1-2,0][2-2,0] [6-0,0][7-0,0][8-0,0]|[0-1,0][1-1,0][2-1,0]|[3-2,0][4-2,0][5-2,0] [6-0,0][7-0,0][8-0,0]|[0-1,0][1-1,0][2-1,0]|[3-2,0][4-2,0][5-2,0] -----------------+-----------------+------------------------ [0-0,1][1-0,1][2-0,1]|[3-1,1][4-1,1][5-1,1]|[6-2,1][7-2,1][8-2,1] [0-0,1][1-0,1][2-0,1]|[3-1,1][4-1,1][5-1,1]|[6-2,1][7-2,1][8-2,1] [3-0,1][4-0,1][5-0,1]|[6-1,1][7-1,1][8-1,1]|[0-2,1][1-2,1][2-2,1] [3-0,1][4-0,1][5-0,1]|[6-1,1][7-1,1][8-1,1]|[0-2,1][1-2,1][2-2,1] [6-0,1][7-0,1][8-0,1]|[0-1,1][1-1,1][2-1,1]|[3-2,1][4-2,1][5-2,1] [6-0,1][7-0,1][8-0,1]|[0-1,1][1-1,1][2-1,1]|[3-2,1][4-2,1][5-2,1] -----------------+-----------------+------------------------ [0-0,2][1-0,2][2-0,2]|[3-1,2][4-1,2][5-1,2]|[6-2,2][7-2,2][8-2,2] [0-0,2][1-0,2][2-0,2]|[3-1,2][4-1,2][5-1,2]|[6-2,2][7-2,2][8-2,2] [3-0,2][4-0,2][5-0,2]|[6-1,2][7-1,2][8-1,2]|[0-2,2][1-2,2][2-2,2] [3-0,2][4-0,2][5-0,2]|[6-1,2][7-1,2][8-1,2]|[0-2,2][1-2,2][2-2,2] [6-0,2][7-0,2][8-0,2]|[0-1,2][1-1,2][2-1,2]|[3-2,2][4-2,2][5-2,2] [6-0,2][7-0,2][8-0,2]|[0-1,2][1-1,2][2-1,2]|[3-2,2][4-2,2][5-2,2] といった感じにしようと思っています。 画像には配列を使っていてbmp[0]~[8]が9枚の画像を表し、picはbmp[0]~[8]の画像一枚に対してサイズが横3倍縦6倍の画像になるはずです。 自分でプログラムしたのですが、できた画像を拡大しても細かすぎてよくわからない状況です。 for ( y = 0; y < h; y += 6 ) {  for ( x = 0; x < w; x += 3 ) {   for( b = 0; b < 3; b++ ) {    for( a = 0; a < 3; a++ ) {      pic->SetPixel( x + a, y + (2 * b) , bmp[((2 * b) * 3 + a + x) % 9]->GetPixel( x / 3, y / 6 ) );      pic->SetPixel( x + a, y + (2 * b) , bmp[(((2 * b) + 1) * 3 + a + x) % 9]->GetPixel( x / 3, y / 6 ) );    }   }  } } 以前に、同じような配置法なのですが横3倍縦3倍の合成画像として、 [0-0,0][1-0,0][2-0,0]|[3-1,0][4-1,0][5-1,0]|[6-2,0][7-2,0][8-2,0] [3-0,0][4-0,0][5-0,0]|[6-1,0][7-1,0][8-1,0]|[0-2,0][1-2,0][2-2,0] [6-0,0][7-0,0][8-0,0]|[0-1,0][1-1,0][2-1,0]|[3-2,0][4-2,0][5-2,0] -----------------+-----------------+------------------------ [0-0,1][1-0,1][2-0,1]|[3-1,1][4-1,1][5-1,1]|[6-2,1][7-2,1][8-2,1] [3-0,1][4-0,1][5-0,1]|[6-1,1][7-1,1][8-1,1]|[0-2,1][1-2,1][2-2,1] [6-0,1][7-0,1][8-0,1]|[0-1,1][1-1,1][2-1,1]|[3-2,1][4-2,1][5-2,1] -----------------+-----------------+------------------------ [0-0,2][1-0,2][2-0,2]|[3-1,2][4-1,2][5-1,2]|[6-2,2][7-2,2][8-2,2] [3-0,2][4-0,2][5-0,2]|[6-1,2][7-1,2][8-1,2]|[0-2,2][1-2,2][2-2,2] [6-0,2][7-0,2][8-0,2]|[0-1,2][1-1,2][2-1,2]|[3-2,2][4-2,2][5-2,2] の配置プログラムとして、 for ( y = 0; y < h; y += 3 ) {  for ( x = 0; x < w; x += 3 ) {   for( b = 0; b < 3; b++ ) {    for( a = 0; a < 3; a++ ) {      pic->SetPixel( x + a, y + b , bmp[(b * 3 + a + x) % 9]->GetPixel( x / 3, y / 3 ) );    }   }  } } との回答をいただいたので、これを参考に作ってみたのですが・・・。 説明が下手でわかりにくいかもしれませんが、お分かりの方がいましたらご教授お願いします。

  • ラプラス変換で連立微分方程式を解くとき

    お願いします。 連立微分方程式をラプラス変換で解くとき、 たとえばx'をラプラス変換すると sL(x) - x(0) のようにx(0)が出てきますよね。 ラプラス変換の問題集の場合たいてい初期条件が付いているのですが、 初期条件がない場合はこのままx(0)を答えに使用してもよいのでしょうか。 たとえば演算子法で解く問題の場合、 x' = x - 4y y' = x + 5y となっていて、問題集の回答の通り微分演算子で解けば 答えは x = {(C2 - 2C1) - 2C2t}exp(3t) y = (C1 + C2t)exp(3t) (C1,C2は任意定数) となります。一方ラプラス変換で解くと x = (x0 - (2x0 + 4y0)t)exp(3t) y = (y0 + (x0 + 2y0)t)exp(3t) (x0 = x(0),y0 = y(0)) となります。 これは実は C1 = y0, C2 = x0 + 2y0 と置き直すと同じになります。ここで質問です。 (1)このような問題でふつうは任意定数を使うべきでしょうが、 x(0),y(0)を使ったら不正解なのでしょうか。 (2)そもそもx(0),y(0)は任意定数になるのでしょうか。 (3)なんだかラプラス変換があれば微分演算子法は いらない子のような気もしなくはないのですが 気のせいでしょうか? 以上です。よろしくお願いいたします。

専門家に質問してみよう