• 締切済み

VBAでの収束計算

 はじめまして。  この度、業務の関係でExcel上で伝達マトリックス法に基づいた回転軸の危険速度を計算出来るようにしなくてはならず、VBA初心者ではありますが日々プログラムと格闘しております。  プログラムはあらかた出来上がり、数値の読み取り、要素分割、行列計算までは恐らく問題なく出来上がっていると思っております。行列計算後、理論上では境界条件に従ってωの高次方程式が振動数方程式として得られるのですが、この高次方程式の解法が分かりません。と、いうよりは私の認識としてExcelでは「文字」を含む計算が出来ないので結果的に『方程式』として得られないと思っているのですが・・・出来るのでしょうか?(質問が2つになっていますね、申し訳ございません)このような場合の、効率的な計算方法をご存知、または参考になりそうなことなどありましたら、ご協力頂ければ幸いです。 何卒、宜しくお願い致します。

みんなの回答

  • extrabold
  • ベストアンサー率30% (7/23)
回答No.2

Excelで方程式の解を得る方法を寡聞にして知りません。 多分Excelの機能としては用意されていない、と思います。 なので、 1.自力で解析解を求める手順をプログラムに起こす 2.解析解が求めるのが難しい場合には、反復法を使って近似的に解く手順をプログラムに起こす です。他の方の回答は、2のことを指しておられると思います。 が、いきなり何の前提もなしにプログラムを組まれていることはないと思います。参考にされている書籍では、どのようにして計算されている(計算する)と書かれていますでしょうか?また、今までは手計算であったならば、どのように計算されていましたでしょうか? ラプラス変換を用いて、ならば、その手順をプログラムに起こすことを試みられてはいかがでしょうか(1の方法)。 解析的に解く手順が分かれば、1の方が2に比べ圧倒的に計算量が有利です。

hideeeeeen
質問者

お礼

 回答ありがとうございます。  ラプラス変換・・・プログラムに触れるようになってから度々耳にしてはいた言葉ではありますが、学習・確認を怠っていました。もう一度スタート地点に戻り、計算のアルゴリズムから立て直すことも視野に入れプログラム作成に当たりたいと思います。  ありがとうございました。

  • FEX2053
  • ベストアンサー率37% (7987/21355)
回答No.1

Excelでは、方程式は解くことが出来ません。あくまでf(x)=yとして x,yの値を入れ、辺辺の値を比較してループさせることしか出来ません。 ですので、VBAを使った一般的な解法は、辺辺の差が一定範囲内に 収まるまで、DO~WHILEを使ってループさせるという、一種の力技に なります(一部の金利計算では始めからそういうワークシート関数が 用意されていますが、多分質問者の方程式にはそぐわないでしょう) コレをいかに効率的にVBAコードに落とせるかが、プログラマの腕の 見せ所なんですけど・・・。

hideeeeeen
質問者

お礼

素早い回答、誠にありがとうございます。 やはりそうなりますよね・・・。 現在ωの値を0.01刻みで刻ませて方程式の値が0.001に近づくまで計算させているのですが、方程式の次数が軽く200次を超えるようなものなので収束しない。またはとんでもないところが解として得られるといった状況です。時折それらしい数値が得られる場合があるのですが、それはやはりたまたまですよね・・・。次数が高いだけにより細かい刻みでの判定が求められるのですが、そうなると要領の問題が生じますし・・・所詮はExcelですからそれだけ計算精度も怪しくなってきますしね。 ありがとうございました。より有効な手段を得るまではこの線で頑張ってみようと思います。

関連するQ&A

  • 行列計算の因子入力について

     エクセル、特に行列計算に関して初心者です。エクセルを使って行列計算を行おうと思います。  念のため、ここで言う「行列」とは、一般に使われる「行と列」と言う意味ではなく、数学上の行列計算、所謂マトリクス演算のことです。  例えば以下のような2×2の行列を入力する場合、  1 2  3 4 ={1,2;3,4} と入力すればよいと言うところまでは分かったのですが、ここの1~4までの数値は直接キーボード等から入力することしかできません。  私としては別のセルにある数値や計算結果等をこの部分、たとえば「1」のところの値にしたいのですが、どうすればよいのでしょう?  以上、よろしくお願いいたします。

  • 伝達マトリックス法を用いた振動解析

    中空円筒管の両端を固定した場合の振動解析を行っており,伝達マトリクスを算出し,固有値解析を行いたいと考えています. しかし,伝達マトリクスの算出法がおかしいのか,途中の伝達マトリクスの行列式の値を算出したときに発散してしまいます.何か間違っている可能性があるので, 以下の記載において,間違いがあればご指摘願います. (注:xは円筒管の長軸の長さ, Zは変位と力を示す状態量,Uは円筒管の動特性を表す係数マトリクス,Tは伝達マトリクスです.またx_iは任意の接点,x_Nとx_0はそれぞれ短部の接点です.) 円筒管の運動方程式により(1)が導かれます. d/dx{Z(x_i)}={U}{Z(x_i)}・・・・(1) さらに中空円筒管の軸方向の伝達マトリクスは(2)式のように表されます. {Z(x_i)}={T(x_i-1)}{Z(x_i-1)}・・(2) (2)式を(1)式に代入すると d/dx{T(x_i-1)}={U}{T(x_i-1)} ・・(3) ここで,(3)式においてオイラー法(もっとも簡単であるため)を用いて離散化すると ({T(x_i)}- {T(x_i-1)})/dx={U}{T(x_i-1)} 整理すると {T(x_i)}= {T(x_i-1)}+dx{U}{T(x_i-1)} ・・(4) ここで(4)式で示す各節点における{T(x_i)}を初期値{T(x_0)}={単位行列}として順々に計算により求める. 一方,伝達マトリクスはいくつかの要素が連続的に結合されている系であることから {Z(x_N)}= {T(x_N)} {T(x_N-1)} ・・・・{T(x_1)} {T(x_0)}{Z(x_0)} ・・(5) {T(x)}={T(x_N)} {T(x_N-1)} ・・・・{T(x_1)} {T(x_0)}・・(6)とおくと {Z(x_N)}= {T(x)}{Z(x_0)} ・・(7) 円筒間の両端x_N,x_0における境界条件の基に{T(x)}の行列式が0になるような,各固有振動数を求めればよい. そのために(4)式で求めた{T(x_i)}を(6)式に代入して求めて,(7)式において任意の境界条件が成り立つ行列式を算出すればよいと考えていますが,何か考え方に間違いがあればご指摘願いたいと思います.

  • 量子論の計算方法

    量子論の計算において離散量で有限の場合は行列表示、連続量をあつかう場合は積分を用いて計算します。しかし一次元調和振動子の場合などはシュレディンガー方程式を変数変換してエルミート多項式をとけばエネルギーが求まりますが、この場合は消滅生成演算子を用いてH=aa*+1/2(無時限化しました)とおいてからa*を固有ベクトルにかけて計算すれば特殊関数を用いるよりもはるかに簡単にエネルギーを求めることができます。この方法は非常に便利なのですが、量子論のほかの計算(たとえば井戸型ポテンシャルや粒子の散乱等)には用いることができません。どうして調和振動子だけこの方法が適用できてほかのケースには当てはまらないのでしょうか。その理論的背景にはどのようなものがあるのでしょうか。わかる方がいらしたら教えてくれませんか。

  • 有限要素法の計算量のオーダーについて

    有限要素法を勉強しています。 そこで、自由度nの問題について、「要素剛性行列の評価と全体剛性行列への足し込み」の一般的な計算量のオーダーと「CG法での連立方程式の反復解法」の計算量のオーダーを教えてください。 素人質問で申し訳ありませんが、よろしくお願いします。

  • ラプラス方程式の解法(情報処理として)と共役勾配法

    情報処理の数学はカテゴリ違いかもしれませんが、適当なところを見出せませんでしたので。 (以下、長文で申し訳ありません。) ラプラス方程式やポアソン方程式の境界値問題を解く方法にSOR法が あります。これは連立一次方程式の反復解法の1つだとも言えると思い ます。連立一次方程式の解法は通常AX=BとなってマトリックスAと既知 ベクトルBに対して未知ベクトルXを解くわけですが、ラプラス方程式 をSOR法で解く場合、AX=Bという形にはしません(そういう風に表現 はできますが)。例えば2次元を考えると100×100の2次元の領域を解く 場合、未知数は10000個です。これをAX=Bという風に考えたら、10000元 連立一次方程式を解くことになり、A(10000,10000)のようにメモリ確保 も大変ですが、実際にはそのように解きませんね。マトリックスAとい うメモリの取り方をしないのです。 100×100の格子領域でSOR法で解くとプログラムステップとしては数十 行ぐらいとなり、大したことはありませんね。 しかし、情報処理の連立一次方程式の解法の本を見ると、それはあくま でも連立1次方程式があった場合ということを前提としているのでその ようなメモリの確保から解説がスタートするようです。 そこで質問ですが、ラプラスやポアソン方程式を(前処理付)共役勾配 法などで解く場合、メモリ確保の前提条件としては連立一次方程式の形 ではないはずです。本を見るとマトリックス解法としての共役勾配法が 出ていますが、ラプラス方程式、ポアソン方程式の特化して解説してい る本などないでしょうか。また、簡単に説明できるのであれば教えて頂 きたいのですが。

  • 行列の問題

    行列の問題なのですが分かる方はいますか? 点P=(1,2,3)をx軸に関して45°だけ回転し、続いて、(-1,-2,-3)だけ平行移動した。 4次元マトリックスを用いて座標を計算するにはどうすればいいのですか? どなたか知恵を貸してください。

  • 数学の線形代数の問題なのですが、n×nの2つのマトリックスA,Bがあり

    数学の線形代数の問題なのですが、n×nの2つのマトリックスA,Bがあります。AとBの積の行列式はAの行列式とBの行列式の積となるようです。 すなわち、det(AB)=det(A)det(B) です。これは任意のn(1以上の整数)で成り立つのでしょうか。 テキストを見たのですが、省略されているようです。n=2の場合は、計算が簡単なので確かめられますが、高次だったらどうなるでしょうか。 よろしくお願いします。

  • 交点の計算

    関数電卓を使って、交点の計算を早くしたいです。 XY平面上の既知点AとBを通る直線と、CとDを通る直線の交点です。一応、1.統計計算で式を作り、2.方程式計算で解を求めるという方法は知っていますが、これでもかなり大変です。 行列計算をうまく使ったら、一度に解ける方法があるのではないかと思うのですが、知りませんか? よいサイトなどございましたら、ご紹介ください。 なお関数電卓でプログラムは使用不可です。

  • FEM有限要素法について

    物理シミュレーション手法の1つのFEMについてお尋ねします。 ※いつもは差分法を用いて計算をしている人間からみた漠然とした感覚での質問です。 1.FEMの基本的な考え方は内挿関数(いろいろ名称がありますが)を使って節点上で定義された未知数を領域内部に連続的に展開し、方程式(重み関数をかけて)を領域内部で積分するという展開になると思います(がラーキン法)。このとき部分積分を用いて弱形式に変換したりするわけですが、この部分積分は紙と鉛筆を使って数学理論的に実施するものなのでしょうか。もともと解く方程式の複雑さによってはなかなか難しいのではないかと思いますが。どのような場合でもできるのでしょうか。 (差分だと3回微分でも何とかやることができそうです。もちろん困難もありますが見通しはつきやすい。) 2.自然境界条件(境界での微分値が指定されている)ところの説明でも部分積分が出てきます。自然境界条件の設定の考え方のコツを教えて頂きたいのですが。本を読むとポテンシャル理論を使う実例が示されていたりしており、ポテンシャル問題でない場合はどうするのかなと思います。 基本境界条件(境界での値が指定されている)についてはマトリックスの一部に000010000など使うと問題なく指定できます。これはすごくわかりやすいのですが。 3.FEMはラプラス方程式、ポアソン方程式、などよく知られた割りと形式的に簡単に見える方程式の説明が多いのですが、微分の回数が増えるとか自分で式を作ったような場合実行するのが難しいものでしょうか。前述しましたが、3回微分の場合、1回積分して2回微分になるから内挿関数が直線的だと2回微分がゼロとなりますから使えないということになりそうです。差分とはだいぶ違うな思います。解きやすい問題は行列にしたら差分と同じということになるようですが。 以上、よろしくお願いします。漠然とした質問と言いながら長くなってしまいました。

  • 大規模行列の計算

    10000*10000の大規模行列を解くプログラムを作成したいと考えています。 行列は対称行列で疎行列です。一行あたりの非零要素は10~20程度しかなく、ほとんどが零要素になっています。 メモリの関係上[10000][10000]の配列の形で確保することはまず無理でした。なのでガウスの消去法は使えないかと思います。(使えるのかもしれませんが、要素のうまい記憶方法のアルゴリズムが浮かびません) 解法として、ウェーブ・フロント法を使おうと考えたのですが、計算前の行列内の零要素で上三角行列を求める過程において非零要素となる要素については、あらかじめ記憶しておかなければなりません。しかし、零要素から非零要素に変化する要素を発見するアルゴリズムがわかりません。 その方法や、そのほかの方法で10000*10000の大規模行列を解く方法があれば教えてください!

専門家に質問してみよう