いま、FORTRANで連立方程式を解きたいと思っています。そこで、どんな方程式なら解けるのかということを人に聞いたところ、次の(1)と(2)の場合しか解けないと言われました。

(1)マトリクスの形で表現できるもの
(2)未知数が1つだけのもの

これは本当ですか?(1)と(2)以外の場合は解けないのですか?教えてください。

また、(1)と(2)しか解けない場合でも、そうでない場合でも、その理由を簡単に説明してください。

よろしくお願いいたします。

このQ&Aに関連する最新のQ&A

A 回答 (3件)

(1)(2)のような単純な判断にはなりません。


実数または複素数の場合は、次のように考えます。

[ア]未知数がN個ある。
[イ]独立で、矛盾しない方程式がM個ある。

この場合、M>N なら解けません。M≦Nなら解けます。ただし、M<Nの場合は、不定方程式といって、解の中に任意の値をもつ変数が入ります。
(例)2つの未知数x,y について1つの式 x+y=1 がある場合、解はtを任意の値として x=t, y=1-t

「独立」の意味は、ある方程式から別の方程式を導くことができないということです。たとえば、式1と式2から式3が導ける場合、これらは独立ではありません。
(例)x+y+z=3, x-y-z=1, y+z=1 は独立ではありません。

方程式が矛盾する場合は解けません。
(例)x+y=3, x+z=4, z-y=5 は矛盾しています。

変域が限られている(たとえば整数)場合は、特殊な取り扱いが必要です。また、二次以上の方程式では、解が複数ある場合や、複素数なら解があるが実数では解がないという場合があります。

連立一次方程式で、未知数がN個、方程式がM個 の場合は、係数を行列で表わして、
AX=B
A:係数の行列(N行M列) X:未知数の列ベクトル(N行1列) B:定数項の列ベクトル(M行1列)
と書けます。マトリクスとは行列のことです。

行列式とか、行列の階数というものを計算して、解の有無を判定します。どんな場合に解がありどんな場合に解がないのか、という議論は次のページに詳しく書いてあります。
http://next1.cc.it-hiroshima.ac.jp/MULTIMEDIA/li …

参考URL:http://next1.cc.it-hiroshima.ac.jp/MULTIMEDIA/li …

この回答への補足

詳しく説明していただきありがとうございます。

補足します。私の扱っている連立方程式はM=Nです。したがって、理論上は解けるはずです。ただし、かなり複雑な方程式なので、マトリクスの形にはなりません。このような場合でも解けるのですか?教えてください。

また、回答文中に

>この場合、M>N なら解けません。M≦Nなら解けます。

とありますが、この不等号の向きは逆だと思うのですが、どうなんでしょうか?

よろしくお願いいたします。

補足日時:2005/04/24 02:04
    • good
    • 0

No.1です。

補足への回答です。

不等号の向き(方程式が多すぎると解けない)は合っていますが、いくつか不適当なところがありました。

独立で矛盾しない方程式がN個を超えてあることはありませんので、[イ]を

[イ]独立な方程式がM個ある

と訂正します。
また、最後の部分で

A:係数の行列(N行M列)

は(M行N列)の誤りです。

さて、マトリクスにならないということは、二次以上の方程式であるか、非線形関数を含んでいるということだと思います。これが代数的に解ける見通しがない場合は、反復計算を使うことになります。反復計算にはいろいろな方法があります。たとえば、連立方程式が

x1 = g1(x1,x2,...,xN)
x2 = g2(x1,x2,...,xN)
...
というように表される場合は、適当な初期値x1,x2,...,xNから出発して次のx1,x2,..,xNを求める反復計算が考えられます。これは収束するとは限りません。

また、連立方程式が
f1(x1,x2,..,xN) = b1
f2(x1,x2,...xN) = b2
....
と表わされる場合、x1,x2,...,xNに適当な初期値を入れて求めた値とb1,b2,...,bNの差を残差e1,e2,...,eNとします。

ここで偏微分 ∂f1/∂x1, ∂f1/∂x2, ..., ∂fN/∂xN を求めるとこれらは行列になります。数式で求められない場合は数値微分によります。このとき、
(∂fn/∂x1)s1 + (∂fn/∂x2)s2 + … + (∂fn/∂xN)sN = en (n=1,2,...,N)
となるようなs1,...,sNを偏微係数を係数とする連立一次方程式を解いて求め、xk-sk(k=1,2,...,N)を次の近似値とするニュートン法は、最初にかなり良い近似値を選べば高速高精度です。

解が実数の範囲でないときは、複素数での計算が必要になります。その他、初期値の選び方や精度の検討、反復をどんな条件によりどこで打ち切るかの検討、収束しない場合の判定とエラー表示の検討が必要です。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございました。

お礼日時:2005/05/09 19:18

FORTRANで解くと言うことなので,多元連立1次方程式に限定すれば,代数的に解けるもの,解が存在するものは全て解けます。



別にマトリックス表現をしなくても,代数解法をそのままプログラミングすれば,解けます。つまり,解き方が分かっている連立方程式は,紙と鉛筆と時間さえあれば筆算で解けますね!そのときの解法をそのままプログラムにすれば解けると言うことです。ここで,マトリックスで表現するというのは,コンピュータの「最も解きやすい形で表現する」,位の意味です。

例えば,有限の元を持つ連立方程式でないと解けません。無限だと,代数的にも解けません。

例えば,多元連立1次方程式というのは,連立の数だけ未知数があります。3元連立方程式には3個の未知数があります。当然,連立の数よりも未知数の多い連立方程式は代数では解けません。これは,FORTRANという言語の問題でなく代数的な問題です。

例えば,0による除算を含む場合は,エラーになって解けません。ただし,0による除算を含まないような形に変形することで,出来るようになります。これも,代数的な問題でしょうね。

例えば,解がない場合。これも「代数的に解けない」に含まれますよね。

結局,代数的に解けないと解けないのです。逆に言うと,代数的に解ければ解けます。

これは,私の経験則ですが,専門的にどうなるかは,別の専門家の意見を聞いてみてください。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございました。

お礼日時:2005/05/09 19:17

このQ&Aに関連する人気のQ&A

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

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

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

Q等加速度運動の計算です。下記の連立方程式の解き方がわかりません

等加速度運動の計算です。下記の連立方程式の解き方がわかりません
20=v+at
vt+(1/2)at^2=120
v*(t+20)=120

どうやってv a t の値を出すのか教えてください。
また2番目の式は
20^2-v^2=2*a*120 でもできるようですが、tがわからない場合この式を使う意味はあるのでしょうか。2乗された分よけいに連立方程式が解けません

Aベストアンサー

>v+at=20    (1)
>vt+(1/2)at^2=120    (2)
>v*(t+20)=120    (3)

  ↓ at^2 の消去
 vt + at^2 = 20t    (1)から
 2vt + at^2 = 240    (2)から
その差から、
 vt = 240 - 20t    (4)

 vt = 120 - 20v    (3)から
(4) と等置して、
 t = v + 6
これを (4) へ代入。
 v(v + 6) = 240 - 20(v + 6)
 v^2 + 26v - 120 = 0
この二次方程式から v を求め、あとはバタバタ。
  

QFortran90/Fortran95→Fortran77

大学の授業でFortranを使ったプログラミングを勉強しています。

以下の文が大学のPCに入っているコンパイラでは問題なくコンパイルでき実行できるのですが、家のPCだとコンパイルすることが出来ません(以下の文でエラーが出ます)
大学のPCの開発環境はFujitsu-FORTRANだと思います(^ ^;
家のPCはSalford FTN77 Personal Edition CompilerとCPad for Salford FTN77を組み合わせて使用しています

なぜエラーがでるのか自分なりに考えた結果、Fortran90/Fortran95のプログラムをFortran77のコンパイラでコンパイルしているからだと思います(全くの勘違いだったら指摘して下さい)

Fortran90/Fortran95の開発環境がフリーで整えばいいのですが、見つからないのでプログラムを修正したいと思います そこで、力を貸していただきたいのです

前置きが長くなりましたが、エラーが出る文は以下のところです
open(8,file='freq_ex13.dat',action='write',status='replace')
ここを、Fortran77のコンパイラでコンパイルできるようにアドバイスを下さい よろしくお願いします

大学の授業でFortranを使ったプログラミングを勉強しています。

以下の文が大学のPCに入っているコンパイラでは問題なくコンパイルでき実行できるのですが、家のPCだとコンパイルすることが出来ません(以下の文でエラーが出ます)
大学のPCの開発環境はFujitsu-FORTRANだと思います(^ ^;
家のPCはSalford FTN77 Personal Edition CompilerとCPad for Salford FTN77を組み合わせて使用しています

なぜエラーがでるのか自分なりに考えた結果、Fortran90/Fortran95のプログラムをFortran77のコンパイラでコン...続きを読む

Aベストアンサー

action='write'を削除してみては?
8番にREADを使わなければいいだけの話です。
http://docs.hp.com/ja/B3908-90007/ch10s65.html#id21163286

Fortranはコンパイラ毎に独自の拡張が相当されてますから、移植する際にはどの拡張が使えるのか把握する必要があります。
使えない場合はコンパイルエラーが返ってくるのですぐにわかりますけど。
http://www.cc.nao.ac.jp/vppman/HTML/japan/langFort/fvp11/fvp00079.htm

参考URL:http://docs.hp.com/ja/B3908-90007/ch10s65.html#id21163286

Q等加速度運動の計算です。下記の連立方程式の解き方がわかりません

等加速度運動の計算です。下記の連立方程式の解き方がわかりません
等加速度運動の計算です。下記の連立方程式の解き方がわかりません
20=v+at
vt+(1/2)at^2=120
v*(t+20)=120

どうやってv a t の値を出すのか教えてください。
また2番目の式は
20^2-v^2=2*a*120 でもできるようですが、tがわからない場合この式を使う意味はあるのでしょうか。2乗された分よけいに連立方程式が解けません

Aベストアンサー

20=v+at → 20-at=v (1) 
vt+(1/2)at^2=120   (2)
v(t+20)=120     (3)
(1),(2)から
(20-at)t+(1/2)at^2=120
20(2t-12)=at^2     (4)
(1),(3)から
(20-at)(t+20)=120
20(t+14)=at(t+20)    (5)
(4),(5)から
at(t+20)(2t-12)=at^2(t+14)
at≠0から
t^2+14t-240=0
(t-10)(t+24)=0
t=10またはt=-24
t=10のとき
v(10+20)=120
v=4
20=4+10a
a=4/5

QMS-FortranとFortran90

私は研究でFortran90を使っているのですが、研究に使うプログラムはMS-Fortranを用いて書かれているものでした。

そこで質問なんですが、MS-FortranとFortran90の違いについて知っている方がいれば教えてください。
また、MS-FortranでかかれたソースコードをFortranにコピーした時に何か弊害はあるのでしょうか?(人づてに弊害が起こると聞いたことがあるのですが・・・)。

プログラミングを本格的に始めて、まだ3ヶ月ほどで用語の使い方がわかりにくいところがあるかもしれませんがよろしくお願いします。

Aベストアンサー

MicrosoftがFortranを出していた時期を考えると、多分ですが、Fortran77だと思いますね。
Fortran90自体、製品が揃ったのは90年からかなり立っています。そのころには、Microsoftの言語製品はCとBASICだけになっていたんじゃないかな。

なお、MS-Fortranに限らず、intel系のFortranでは、86系のアーキテクチャの影響でホストに比べ、一部の機能が制限されている場合があります、これらについてはマニュアルを参照してください。

Q連立方程式の利用の問題で、立式ができたのにそれをどう計算したらいいかわ

連立方程式の利用の問題で、立式ができたのにそれをどう計算したらいいかわかりません。
問題は、
【栄造くんはA駅から山を越えてB駅までのハイキングを計画した。計画ではA駅から頂上まで毎時4kmの速さ、頂上からB駅まで毎時6kmの速さで歩き、5時間歩けばいいはずであったが、実際にはA駅から頂上まで毎時3km、頂上からB駅まで毎時5kmの速さでしか歩けなかったため、6時間28分歩いたことになった。A駅から頂上までの道のりをxkm、頂上からB駅までの道のりをykmとして連立方程式をたて、A駅から頂上を経てB駅までの道のりを求めよ】
というものです。

立てた式は、
x/4 + y/6=5
x/3 + y/5=628/60
なのですが、
この式の解き方がわからないのです。

628/60という部分をどう処理したらいいのかちんぷんかんぷんで……。

連立方程式の神様、どうか教えてください。

Aベストアンサー

3x+2y=60
5x+3y=97
これを解くと

9x+6y=180
10x+6y=194

-x=-14
x=14,42+2y=60
2y=18
y=9

14kmと9kmでいいと思いますが・・・
(連立方程式の途中で5Xを2倍にし忘れてるだけですよ)

QFortran77 (intel fortran)

Fortran77のプログラムをIntel Fortran (ifort v14.0.1)でコンパイルした時、以下のワーニングがでます。

remark #8291: Recommended relationship between field width 'W' and the number of fractional digits 'D' in this edit descriptor is 'W>=D+7'.
100 FORMAT(12E9.3)
--------------------------^

100の書式はREAL*8で宣言された変数を書き出す時に使っています。

これは具体的にはどういう問題について警告しているのでしょうか?

環境はCentOS6.5 32bitにて実行しています。

よろしくお願いいたします。

Aベストアンサー

E9.3って、全体を9文字で、小数点以下を3文字でと言う意味ですが、全体幅は小数点以下幅の+7以上であるべきと言うのがウォーニングメッセージ内容です。

+0.123E+00

のように、小数点以下の数字以外に、符号1桁、小数点以上1桁以上、小数点自体に1桁、Eが1桁、指数部符号1桁、指数部2桁で、合計7桁以上必要です。

Q数学の連立方程式のことについて教えてください!2x-2y=3 x-y=3どのように計算す

数学の連立方程式のことについて教えてください!

2x-2y=3
x-y=3

どのように計算すればいいのか教えてください!まったく検討もつきません…

Aベストアンサー

2x-2y=3  (1)
x-y=3   (2)

のような方程式は「不能」の呼ばれます。

(2)から
 x - y = 3
なので、
 2(x - y) = 6
ですが、これは(1)と矛盾します。

この2つの式を同時に満足する「x, y のペア」は存在しません。

もう一つの質問の「不定」とともに、解くことのできない方程式です。

↓ 参考まで。
http://www.geisya.or.jp/~mwm48961/kou2/linear_eq2.html

QFortran77依頼Fortranを使用していない

のですが今のFortranのバージョンはいくつでしょうか?
昨今の利用状況についても教えてください

Aベストアンサー

Fortran 66 : 1966 年に ASA (American Standards Association) に よって制定。
Fortran 77 : 1978 年制定。長い間使われ、現在でも通用する。
Fortran 90 : ISO (International Standard Organization) 委員会 WG5 の下で ANSI (American National Standard Institute) 公認委員会 J3 が開発。 配列、構造体などの機能を強化。1991 年制定。現在のほとんどの処理系が対応。
Fortran 95 : Fortran 90 の修正版。1995 年完成。ISO によって 1997 年に採用。ほとんどの処理系が対応。
Fortran 2000 : 最新規格。一部準拠というの処理系は多いのだが…。

現在、メジャーなのはFortran 90/77ですね。
http://ja.wikipedia.org/wiki/Fortran#.E4.BB.95.E6.A7.98.E3.81.AE.E5.A4.89.E9.81.B7

Fortran 66 : 1966 年に ASA (American Standards Association) に よって制定。
Fortran 77 : 1978 年制定。長い間使われ、現在でも通用する。
Fortran 90 : ISO (International Standard Organization) 委員会 WG5 の下で ANSI (American National Standard Institute) 公認委員会 J3 が開発。 配列、構造体などの機能を強化。1991 年制定。現在のほとんどの処理系が対応。
Fortran 95 : Fortran 90 の修正版。1995 年完成。ISO によって 1997 年に採用。ほとんどの処理系が対応。
Fortran 2000 : 最新...続きを読む

Q分数を含む連立方程式の効率のよい計算の仕方。

分数を含む連立方程式の効率のよい計算の仕方。

連立方程式
2x+3y=1/2
x-y=-1/2

上記の方程式の効率のよい解き方とは、どういったものでしょうか?
または、採点者に評価してもらえる回答とはどのようなものでしょうか?
数学が得意な方、解説をお願いします。


因みに、上記の解を求めると
x=-1/5
y=3/10
です。

解だけなら地道に計算をすれば出るので、解法にもこだわりを持ちたいと思い質問をしました。

Aベストアンサー

知的な質問というか向上心が見られていいですね。

下の式を2倍して上の式から引いてしまえば一気に5y=~形のになるので私ならそうします。

それ以上に早いのは難しいですね。

とりあえず、代入法はそのままではきれいにならないので避けます。

下の式を2倍とか3倍にして計算するのがきれいだと思います。

QFortranについての質問です。下のプログラムは、ある地点(今回は1

Fortranについての質問です。下のプログラムは、ある地点(今回は14161~14163)の33年間(1976~2008)の気温の平均を欠損値を考慮してだしているはずです。うるう年の判定はおまけで書いています。
この平均値に標準偏差もつけるプログラムにしたいのですが、どう書いていいのか手詰まり中です。どうかアドバイスください。


---------データの一部(14162_temp1997.csv)-------------------------------------


14162 1997 1 1 141.332 43.0583 -10
14162 1997 1 2 141.332 43.0583 18
14162 1997 1 3 141.332 43.0583 -2



---------プログラム------------------------------------------------------------


program sapporo_kikouchi

INTEGER :: sum, no, point
INTEGER :: year, mon, day, data
INTEGER :: doy
REAL,dimension(365) :: temp, ndata
REAL :: lon, lat
CHARACTER*4 yyyy
CHARACTER*5 sssss
ndata(:)=0.0
temp(:)=0.0

do ispot=14161,14163
write(sssss,"(i5)") ispot
do iwork=1976, 2008
write(yyyy,"(i4.4)") iwork

open(50, file=''//sssss//'_temp'//yyyy//'.csv', status='old',iostat=io)
if (io < 0) cycle
! write(6,*) ispot iwork


  do i = 1,366

read(50,*,iostat=io) id,year,mon,day,lon,lat,data
if(io < 0) exit
if(mon==2 .AND. day==29) then
cycle
endif

call date2doy(year,mon,day,doy)
temp(doy) = temp(doy) + data/10.0
ndata(doy) = ndata(doy) + 1

! doyは一年のうち何日目かを表している


enddo

close(50)
enddo !!! end of year loop
enddo

do i=1,365

if( ndata(i) == 0 ) then
temp(i) = -99999.9
else
temp(i)=temp(i)/ndata(i)
endif


write(6,*) i, temp(i), ndata(i)
! write(11,*) i,',',temp(i),',',ndata(i)

end do

stop
end program

subroutine date2doy(iy,im,id,idoy)
INTEGER,dimension(12) :: nday
INTEGER :: uruu !!uruu=1: うるう年、uruu=0: 通常の年

uruu=0
DATA nday /31,28,31,30,31,30,31,31,30,31,30,31/

if(mod(iy,4)==0 .AND. mod(iy,100)/=0) then
uruu=1
endif
if(mod(iy,1000)==0) then
uruu=1
endif


!! うるう年も無視する
itotal = 0
if( im /= 1 )then
do m=1, im-1
itotal = itotal + nday(m)
enddo
endif
idoy = id + itotal

! write(6,*) iy,im,id, idoy


return
end

Fortranについての質問です。下のプログラムは、ある地点(今回は14161~14163)の33年間(1976~2008)の気温の平均を欠損値を考慮してだしているはずです。うるう年の判定はおまけで書いています。
この平均値に標準偏差もつけるプログラムにしたいのですが、どう書いていいのか手詰まり中です。どうかアドバイスください。


---------データの一部(14162_temp1997.csv)-------------------------------------


14162 1997 1 1 141.332 43.0583 -10
14162 1997 1 2 141.332 43.0583 18
14162 1997 1 3 141.332 4...続きを読む

Aベストアンサー

1: do doy = 1,365
2: ave = 0.0
3: var = 0.0
4: do i=1,ndata(doy)
5: ave = ave + ndatax(doy,i)
6: temp(doy) = ave/ndata(doy)
7: var = var + ( ndatax(doy,i) - temp(doy))**2
8: stdev(doy) = sqrt(var/(ndata(doy)-1))
9: end do
10: write(6,*) doy, temp(doy), ndata(doy),stdevplus(doy),stdevminus(doy)
11: end do
これはあなたのプログラムを抜き出したものですが,平均値に関係しているのは
2で初期化して,4から9のループの中で5で加算し,6で割り算をしています。
まあ,これでも計算はうまくいきますが,6で割り算はループのの外でやる方が効率的でしょう。
しかし標準偏差の計算はひどいことになっています。
3で初期化して,4から9のループの中で7で加算し,8で割り算をしています。
ところがループの中で加算すべき物はデータ引く平均値の2乗であるのに,7はループの中ですから加算する時点では平均値の計算途中であって,まだ平均値になっていません。それを加算したところで計算がうまくいくはずがないのです。それで前回
> 標準偏差を計算するときには,すでに平均値が分かっていなければなりません。
> ところが,あなたのプログラムでは
> temp(doy) = ave/ndata(doy)
> で平均値を求めるところよりも前で,標準偏差の計算らしき部分に入っています。これでは計算がおかしく> なって当然でしょう。
と言ったのに理解されなかったようです。それではどうするかと言えば,平均値を計算するためのループが終わってから,あらためて標準偏差を計算するためのループをまわしてください。
! ave = 0.0
! var = 0.0
! do i = 1,ndata(doy)
! ave = ave + ndatax(doy,i)
! end do
! temp(doy) = ave/ndata(doy)
! do i = 1,ndata(doy)
! var = var + (ndatax(doy,i)-temp(doy))**2
! end do
! stdev(doy) = sqrt(var/(ndata(doy)-1))
こんな感じですね。明示的にループをまわさずにsum関数を使って
! temp(doy) = sum(ndatax(doy,:ndata(doy)))/ndata(doy)
! stdev(doy) = sqrt(sum((ndatax(doy,:ndata(doy))-temp(doy))**2)/(ndata(doy)-1))
とすることもできます。

1: do doy = 1,365
2: ave = 0.0
3: var = 0.0
4: do i=1,ndata(doy)
5: ave = ave + ndatax(doy,i)
6: temp(doy) = ave/ndata(doy)
7: var = var + ( ndatax(doy,i) - temp(doy))**2
8: stdev(doy) = sqrt(var/(ndata(doy)-1))
9: end do
10: write(6,*) doy, temp(doy), ndata(doy),stdevplus(doy),stdevminus(doy)
11: end do
これはあなたのプログラムを抜き出したものですが,平均値に関係しているのは
2で初期化して,4から9のループの中で5で加算し,6で割り算をしています。
まあ,これでも計算はうまくい...続きを読む


人気Q&Aランキング

おすすめ情報