初めまして。C言語を学びはじめて1週間ほどの大学生です。
今回、大学での課題で行き詰まったので2つほど質問させていただきます。
プログラミング以前に、数学の知識もまだまだな為、そういった点もアドバイスお願いします。
①直列のRC回路において、電源電圧Vと抵抗RとコンデンサCは決められています。
スイッチを入れると、抵抗には
i=(V-v)/R (1)
の電流が流れ(vはコンデンサにかかる電圧)、それによってコンデンサCが充電されます。
vはdv/dt=i/C (2)
の割合で上昇します。
これをオイラー法で
v(tk+1)=v(tk)+(1/C)i(tk)Δt (3)
Δt=0.001のとき、0≤t≤1.0の範囲でv(t),i(t)を求めろというものです。
コード:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
double dxdt( double x)
{
double c = 0.00001;
double r = 10000;
double e = 5;
return (e-x)/(r*c);
}
// オイラー法(初期条件x0, 区間[t0, tn])
double eulerMethod(double x0, double t0, double tn, int n)
{
int i;
double x, t, h;
x = x0=0;
t = t0=0;
h = 0.001;
n=1000;
// 漸化式を計算
for ( i=1; i <= n ; i++){
x += dxdt(x) * h;
t = t0 + i*h;
printf("%f\n", x);
}
return x;
}
のようなものになりそうなんですが、如何せんまだまだコードについての理解が乏しく、行き詰まっています。
解き方の考え方についてのアドバイスや、コードの書き方についてのアドバイスよろしくお願いします。
②2つの関数が示すカウンタ値をモータの角度に変換し、tによっての出力角度を出せというものです。
エンコーダの分解能を1000、ギア比を100、カウンタボードの分解能を2バイトとし、2つの関数は上位バイトと下位バイトを渡します。
サンプリングタイムを0.001秒とし、時刻範囲は0から5です。
こちらの解く方針としては、16進数で与えられる2つの関数を10進数に変換後、2つの関数(上位バイトと下位バイト)の和を出す。
これをエンコーダの分解能とギア比で割る。これを0.001秒ずつ5000回ループすればよいのでは、と考えました。
まだ、プログラミングは行っていませんが、考え方はあっているのでしょうか?
16進数の概念やカウンタボードの概念についての理解が全然です。
考え方を示していただければ、こちらでコードを作って提案しますのでよろしくお願いします。
また、問題に不備がありましたら画像にて説明いたしますのでよろしくお願いします。