掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板2

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.29608

複数の連立方程式なのですが
投稿者---tako(2007/01/26 04:00:05)


定数t=12,C0=3500,Ct1=800,Ct2=2000,SPU=20000,FC=200000で
次の10の式から

Q=sqrt((2*SVoBP*C0*(Ct1+Ct2))/(t*Ct1*Ct2))
S0=sqrt((2*SVoBP*C0)/(t*Ct1))*sqrt(Ct2/(Ct1+Ct2))
C=(S0*S0*Ct1*t/(2*Q))+((Q-S0)*(Q-S0)*Ct2*t/(2*Q))+((C0*SVoBP)/Q)
VCU=C/SVoBP
LPU=SPU-VCU-18000
VCR=VCU/SPU
LPR=(1-VCR)*100
SVoBP=FC/LPU
PBeP=FC/(1-VCR)
2000SVoBP-C-FC=0

9つの変数Q,S0,C,VCU,LPU,VCR,LPR,SVoBP,PBePを出すプログラムを作りたいのですが何度やってもうまくいきません。簡単な計算式ですが数が多くてコンパイルはできても変な値が出てきてしまうのです。おそらくやり方じたいに問題ありだと思っております。
うまいやり方があればご教授願いたいのですがお願いします。
ちなみに私はCygwinをWindowsで使用しています。


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:複数の連立方程式なのですが 29609 tako 2007/01/26 04:09:23
<子記事> Re:複数の連立方程式なのですが 29613 ぽへぇ 2007/01/26 19:14:12


No.29609

Re:複数の連立方程式なのですが
投稿者---tako(2007/01/26 04:09:23)


すみません、最後の式に間違いがありました。
正確には
2000SVoBP-C-FC*t=0
でした。



この投稿にコメントする

削除パスワード

No.29613

Re:複数の連立方程式なのですが
投稿者---ぽへぇ(2007/01/26 19:14:12)


>何度やってもうまくいきません

どんなプログラムを書いていますか?

C言語自体に連立方程式を解く、といった機能はありません。
自分で「連立方程式を解くようなプログラムを書く」ことになります。

 一次連立方程式で解が唯一であるようなものであれば、
「ガウスの消去法(掃き出し法)を使って解け」という
プログラム課題としてよく見かけるものになります。

 そうでなければ、変数がそれぞれ独立になるまで手で
変形するとか、数値計算で近似解を求めるとか。




この投稿にコメントする

削除パスワード

No.29614

Re:複数の連立方程式なのですが
投稿者---tako(2007/01/26 20:48:35)


そうなのですか、ありがとうございます。方程式も解けると思っていました。手計算で変数を独立にして求めてみます。


この投稿にコメントする

削除パスワード

No.29615

Re:複数の連立方程式なのですが
投稿者---かずま(2007/01/26 21:54:49)


> 手計算で変数を独立にして求めてみます。

手計算はしんどいよ。
#include <stdio.h>
#include <math.h>

int main(void)
{
    const double t = 12, C0 = 3500, Ct1 = 800, Ct2 = 2000;
    const double SPU = 20000, FC = 200000;
    double Q, S0, C, VCU, LPU, VCR, LPR, SVoBP, PBeP;
    double K1, K2, K3, K4, D, R;

    // Q = sqrt((2 * SVoBP * C0 * (Ct1 +Ct2)) / (t * Ct1 * Ct2))         [1]
    K1 = sqrt((2 * C0) / (t * Ct1)) * (Ct2 / (Ct1 + Ct2));
    // R = sqrt(SVoBP)
    // Q = K1 * R

    // S0 = sqrt((2 * SVoBP * C0) / (t * Ct1)) * sqrt(Ct2 / (Ct1 + Ct2)) [2]
    K2 = sqrt((2 * C0) / (t * Ct1)) * sqrt(Ct2 / (Ct1 + Ct2));
    // S0 = K2 * R

    //  C = (S0*S0 * Ct1 * t /(2*Q)) + ((Q-S0)*(Q-S0) * Ct2 * t / (2*Q))
    //      + ((C0 * SVoBP) / Q)                                         [3]
    K3 = K2 * K2 * Ct1 * t / 2 + (K1-K2) * (K1-K2) * Ct2 * t / 2
            + C0;
    // C = (K3 * SVoBP) / (K1 * sqrt(SVoBP))
    K4 = K3 / K1;
    // C = K4 * R

    // 2000 * SVoBP - C - FC = 0A  [10]
    // 2000 * R * R - K4 * R - FC = 0
    D = K4 * K4 + 4 * 2000 * FC;
    R = (K4 + sqrt(D)) / (2 * 2000);
    // R = (K4 - sqrt(D)) / (2 * 2000); あとで
    SVoBP = R * R;
    Q  = K1 * R;
    S0 = K2 * R;
    C  = K4 * R;
    VCU = C / SVoBP;         // [4]
    LPU = SPU - VCU - 18000; // [5]
    VCR = VCU / SPU;         // [6]
    LPR = (1 - VCR) * 100;   // [7]
    PBeP = FC / (1 - VCR);   // [9]

    printf("Q  = %f\n", Q);
    printf("S0 = %f\n", S0);
    printf("C  = %f\n", C);
    printf("VCU = %f\n", VCU);
    printf("LPU = %f\n", LPU);
    printf("VCR = %f\n", VCR);
    printf("LPR = %f\n", LPR);
    printf("SVoBP = %f\n", SVoBP);
    printf("PBeP  = %f\n", PBeP);

    // SVoBP = FC / LPU     [8]
    printf("SVoBP = %f\n", FC / LPU);

    printf("---\n");
    R = (K4 - sqrt(D)) / (2 * 2000);
    SVoBP = R * R;
    Q  = K1 * R;
    S0 = K2 * R;
    C  = K4 * R;
    VCU = C / SVoBP;         // [4]
    LPU = SPU - VCU - 18000; // [5]
    VCR = VCU / SPU;         // [6]
    LPR = (1 - VCR) * 100;   // [7]
    PBeP = FC / (1 - VCR);   // [9]
    printf("Q  = %f\n", Q);
    printf("S0 = %f\n", S0);
    printf("C  = %f\n", C);
    printf("VCU = %f\n", VCU);
    printf("LPU = %f\n", LPU);
    printf("VCR = %f\n", VCR);
    printf("LPR = %f\n", LPR);
    printf("SVoBP = %f\n", SVoBP);
    printf("PBeP  = %f\n", PBeP);
    // SVoBP = FC / LPU     [8]
    printf("SVoBP = %f\n", FC / LPU);
    return 0;
}



この投稿にコメントする

削除パスワード

No.29616

Re:複数の連立方程式なのですが
投稿者---tako(2007/01/27 03:15:18)


>手計算はしんどいよ。

手計算頑張りました。Cの式にしたら

X=sqrt((2C0)/t*Ct1(SPU-CPU))[Ct1*Ct2*t/2(Ct1+Ct2)+Ct2*t/2[(sqrt(Ct1+Ct2)/(Ct2))]-Ct2*t(2Ct1+Ct2)/(2Ct1+2Ct2)*(sqrt(Ct2)/(Ct1+Ct2))];
C=X*X*FC*t/(1+X*X)

になりました。
今終わった所だったのですが、こんな素晴らしい、やり方があるとは!!参考にさせて頂きます。ありがとうございます。


この投稿にコメントする

削除パスワード

No.29618

Re:複数の連立方程式なのですが
投稿者---かずま(2007/01/27 12:40:24)


> こんな素晴らしい、やり方があるとは!!

今見たら、[1] の式から K1 を求めるところが全く違っているし、
[10] の式も * t の訂正をしていませんね。
さらに、変数が 9つなのに、式が 10個あって、[8] の式が余っていますが、
SVoBP の値が同じにならず、解が求まらないことになってしまいます。

正しい解はなんですか?



この投稿にコメントする

削除パスワード

No.29619

Re:複数の連立方程式なのですが
投稿者---tako(2007/01/27 21:25:48)


>今見たら、[1] の式から K1 を求めるところが全く違っているし、
>[10] の式も * t の訂正をしていませんね。
>さらに、変数が 9つなのに、式が 10個あって、[8] の式が余っていますが、

[1]式のK1は少し訂正させて頂いて

K1=sqrt((2*C0*(Ct1+Ct2))/(t*Ct1*Ct2));

にさせて頂きました。あとは[10]式に*tをつけたら、手で計算した値とばっちり同じになりました。これはちゃんとした例題とかでなくて、私が興味本意で2つの例題をくっつけたモノなのです、だから[8]式は余ってしまうんですが、まったく問題はありませんでした。私が良く考えずに質問してしまったもので、申し訳ありません。ちなみに上の様に直すと

SVoBP=1326.149906

が出てきます。私が手で計算した値はSVoBP=1326.15でしたので完璧です。
このやり方はとても勉強になりました。ありがとうございます。



この投稿にコメントする

削除パスワード

No.29620

Re:複数の連立方程式なのですが
投稿者---tako(2007/01/27 21:47:16)


>SVoBP の値が同じにならず、解が求まらないことになってしまいます


かずまさん、たびたび申し訳ありません。

SVoBP=FC/LPU; と書いてありましたが、これも

2000SVoBP-C-FC*t=0; に*tを付け忘れたのと同様に

SVoBP=FC*t/LPU; でした。本当に申し訳ないです。

私も式[8]は使わなくても値が出ると分かった時に削除してしまっていたので、気がつきませんでした。

SVoBP=FC*t/LPU; にするとこちらもSVoBP=1326.15になります。

質問しといて内容にミスがあり申し訳ございませんでした。それなのに親切にご回答頂きまして、かずまさんには感謝しています。ありがとうございました。



この投稿にコメントする

削除パスワード

No.29621

Re:複数の連立方程式なのですが
投稿者---tako(2007/01/27 21:50:46)


あと負の値もありましたが、これらは全部正の値なので上側のプログラムだけでOKです。


この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧