• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:2次元の連立方程式 (固有値問題の変形))

2次元連立方程式の解法とは?

このQ&Aのポイント
  • 2次元の連立方程式を解く方法について考えています
  • 具体的には、実対称行列と列ベクトルが与えられた場合の解法を知りたいです
  • 現在考えているアプローチが複雑すぎて行き詰まっています

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

  • ベストアンサー
  • eatern27
  • ベストアンサー率55% (635/1135)
回答No.2

ちゃんと考えてないですが、 A'=PAP^tが対角行列であるような直交行列Pに対して、x'=Px, b'=Pbとでもおいてやれば、 A'x' +b' =λx' x'・x'=1 となるようなx'(とλ)を求める問題に帰着します。 問題としてはAの部分が対角行列になっただけですが、Aが対角行列なら比較的簡単に解けるような気がしますが、いかがでしょうか。

iskw_yj
質問者

お礼

ありがとうございます。 直交行列でベクトルを回転すると、かなり簡単になりますね。 ここから、アプローチ2や3をやってもやっぱりダメでした。 他にも3時間くらい考えていろいろやりましたが、今のところ 良いアイディアは出ていません。 でも、回転したことで、図形で考えることができました。 楕円の大きさが λ で変更されるので、 点 -b' が楕円に乗るように、λを決める、という問題ですね。 解析的な方法はあきらめて、λの値を変えながら 探索で上記の方法でλを決める「妥協」も考えてます。。。。 ただ、もちろん、実際上プログラム可能な 解析的なアプローチがあればベターなので、もう少し考えます。 もし、さらにヒントやアイディアが見つかれば また、教えてください。

その他の回答 (3)

  • eatern27
  • ベストアンサー率55% (635/1135)
回答No.4

あぁ、アプローチ2,3の複雑ってのは計算じゃなくて結果だったんですね。 であればそもそも解そのものが複雑なんですから、計算方法を変えたって同じ結果にたどり着くだけですよね。別のアプローチを考えて何をしたいのでしょう?どうしても解析解が必要だと言うのならその複雑な解で満足するしかありません。 数値解で十分ならばニュートン法や二分法のような簡便な方法でも比較的短時間で十分な精度で方程式の解が出せるんじゃないですかね。

iskw_yj
質問者

お礼

そうですね。結局は自分が何をしたいのか、もう一度考え直してみます。 ただ、数値解を出すのにも、教えていただいたアプローチで、 式を簡単にしてから実施した方がよさそうなので、 教えていただいたことは、役立ちました。 ありがとうございました。

  • ur2c
  • ベストアンサー率63% (264/416)
回答No.3

> 「A や b の値が与えられたときに x を出力する手順」を資料にまとめて説明し、また、プログラムを書こう A, b が数値としてあたえられるのなら、先に示した手順で、できてます。Maxima に不要な所があったので、訂正しておきます。 (%i1) M : matrix([A11-k,A12],[A12,A22-k]); (%i2) c : matrix([-b1],[-b2]); (%i3) x : ratsimp(M^^-1 . c); (%o3) matrix([-(b1*A22-b2*A12-b1*k)/((A11-k)*A22-A12^2-k*A11+k^2)],[(b1*A12-b2*A11+b2*k)/((A11-k)*A22-A12^2-k*A11+k^2)]) (%i4) f : ratsimp(transpose(x).x); あとは A, b の数値を与えて、f = 1 を k について解けば良い。ただし、k が実数になる保証はありません。だから、一般には解がないです。

iskw_yj
質問者

お礼

訂正ありがとう御座います。 参考にさせていただきます。 解がない場合もあるのですね。それは注意したいと思います。

  • ur2c
  • ベストアンサー率63% (264/416)
回答No.1

やりたいこと自体は簡単なので、「結果が複雑すぎて利用できない」という部分が問題なのだろうと思います。なぜ閉形式解が必要なのか、どうなれば利用できるのかなど、実質的な要求仕様がわからないので「閉形式の解を求める限り、複雑になるのはしかたがない」くらいの不毛なことしか言えません。 やってはみましたので、ご参考までに。あなたの計算とほとんど同じでしょうけど。 A x + b = λ x なので k := λ M := A - k I c := -b として M x = c を Maxima で解くと (%i1) M : matrix([A11-k,A12],[A12,A22-k]); (%o1) matrix([A11-k,A12],[A12,A22-k]) (%i2) x : matrix([x1],[x2]); (%o2) matrix([x1],[x2]) (%i3) c : matrix([-b1],[-b2]); (%o3) matrix([-b1],[-b2]) (%i4) s: ratsimp(M^^-1 . c); (%o4) matrix([-(b1*A22-b2*A12-b1*k)/((A11-k)*A22-A12^2-k*A11+k^2)],[(b1*A12-b2*A11+b2*k)/((A11-k)*A22-A12^2-k*A11+k^2)]) これでとりあえず解が求まりました。検算すると (%i5) ratsimp(M . s); (%o5) matrix([-b1],[-b2]) で、合ってます。あとは s の長さが 1 になるように k を調整すれば良い。 (%i6) ratsimp(transpose(s).s); (%o6) 長いので省略 (%i7) solve(%=1,k); ここで << Expression too long to display! >> と言われます。

iskw_yj
質問者

お礼

回答ありがとうございます。 私の要望が不明確ですみません! 具体的には、「A や b の値が与えられたときに x を出力する手順」を 資料にまとめて説明し、また、プログラムを書こうと思っています。 そのための具体的な手順が必要になります。 アプローチ2や3の 「複雑すぎて」 とは、資料化やプログラム化に 利用できない、という意味でした。 私は Wolfram Alpha を使ってみましたが、やっぱり、 Maxima でも同様になりますね。 自分でもう少し考えてみます。。。

関連するQ&A