summaryrefslogtreecommitdiffstats
path: root/fiz/naloga/numerično.c
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--fiz/naloga/numerično.c159
1 files changed, 159 insertions, 0 deletions
diff --git a/fiz/naloga/numerično.c b/fiz/naloga/numerično.c
new file mode 100644
index 0000000..e102899
--- /dev/null
+++ b/fiz/naloga/numerično.c
@@ -0,0 +1,159 @@
+#include <stdlib.h>
+#include <stdio.h>
+#include <error.h>
+#include <math.h>
+#define UVOD "program za numerični izračun jakosti magnetnega polja okoli helmholtzove tuljave\n" \
+ "sem spisal anton luka šijanec za projektno nalogo pri fiziki v tretjem letniku gimb.\n" \
+ "uporaba: %s in argumenti po vrsti:\n" \
+ " 1. radij enega navitja v metrih\n" \
+ " 2. tok, ki teče po vodniku v amperih\n" \
+ " 3. število navojev na enem navitju\n" \
+ " 4. razmak med merilnimi točkami v metrih\n" \
+ " 5. koliko meritev od središča v obe dimenziji naj napravimo\n" \
+ " 6. koliko kotov naj ima navitje - računamo, kot da je mnogokotnik\n" \
+ " 7. tip izhodnih podatkov (pgm ali csv)\n" \
+ "oblika izhodnih podatkov, če je 7. parameter pgm, so pgm slike z vrednostmi 0-255\n" \
+ " - slika je prerez tuljave. magnetno polje teče vodoravno.\n" \
+ " - vrednosti direktno korelirajo z izračunano jakostjo v decigaussih: 10e-5 tesla\n" \
+ " - slika je široka 1+2*koliko in visoka 1+2*koliko (5. argument) slikovnih točk\n" \
+ "oblika izhodnih podatkov, če je 7. parameter csv, je csv, z naslednjimi stolpci:\n" \
+ " 1. vodoravna komponenta oddaljenosti od središča tuljave v metrih\n" \
+ " 2. navpična komponenta oddaljenosti od središča tuljave v metrih\n" \
+ " 3. jakost magnetnega polja v teslah - tokrat ni v decigaussih!\n" \
+ " 4. smer vektorja magnetnega polja v radianih. 0 radianov je smer v desno"
+enum oblika {
+ PGM,
+ CSV
+};
+struct vektor {
+ long double i; // x - desno na sliki
+ long double j; // y - gor na sliki
+ long double k; // z - v monitor
+};
+struct vektor seštej (struct vektor a, struct vektor b) {
+ struct vektor r = {
+ .i = a.i + b.i,
+ .j = a.j + b.j,
+ .k = a.k + b.k,
+ };
+ return r;
+}
+struct vektor vektorski_produkt (struct vektor a, struct vektor b) { // ne bom implementiral
+ struct vektor r = { // matrik
+ .i = a.j*b.k - a.k*b.j,
+ .j = a.k*b.i - a.i*b.k,
+ .k = a.i*b.j - a.j*b.i
+ };
+ return r;
+}
+struct vektor množi (struct vektor a, long double d) {
+ struct vektor r = {
+ .i = a.i * d,
+ .j = a.j * d,
+ .k = a.k * d
+ };
+ return r;
+}
+long double absolutno (struct vektor a) {
+ return sqrtl(a.i*a.i+a.j*a.j+a.k*a.k);
+}
+#define MU0 4e-6*M_PI
+struct vektor tuljava (long double R, unsigned kotov, struct vektor m /* meritev - krajevni */) {
+ long double dl_abs = 2*M_PI*R/kotov; // metri - dolžina vodnika
+ long double dr = 2*M_PI/kotov; // radiani - kot med dl in točko na (0,R - vrh zanke)
+ struct vektor B = {
+ .i = 0,
+ .j = 0,
+ .k = 0
+ };
+ for (unsigned i = 0; i < kotov; i++) {
+ long double theta = dr*i; // kot na krogu
+ struct vektor dl;
+ dl.j = cosl(theta)*dl_abs;
+ dl.k = -sinl(theta)*dl_abs; // minus po skici sodeč ://of.sijanec.eu/sfu/skic.jpg
+ dl.i = 0; // sicer je vseeno, m je na z = 0 in gledamo vse
+ struct vektor r;
+ r.i = 0;
+ r.j = sinl(theta)*R;
+ r.k = cosl(theta)*R;
+ r = seštej(r, m);
+ B = seštej(B,
+ množi(
+ vektorski_produkt(dl, r),
+ 1/(absolutno(r)*absolutno(r)*absolutno(r))
+ )
+ );
+ }
+ B = množi(B, MU0/(4*M_PI));
+ return B;
+} // ena zanka ob toku 1 A. pomnoži s tokom in številom navitij. 0,0 je v sredini. B teče v desno.
+void natisni (FILE * f, struct vektor v, const char * i) {
+ fprintf(f, "vektor %s {\n\t.i = %Lf,\n\t.j = %Lf,\n\t.k = %Lf\n}\n", i, v.i, v.j, v.k);
+}
+int main (int argc, char ** argv) {
+ if (argc != 1 + 7)
+ error(1, 0, UVOD, argv[0] ? argv[0] : "./numerično");
+ long double R = strtold(argv[1], NULL);
+ long double I = strtold(argv[2], NULL);
+ unsigned n = strtol(argv[3], NULL, 10);
+ long double razmak = strtold(argv[4], NULL);
+ int koliko = strtold(argv[5], NULL);
+ unsigned kotov = strtol(argv[6], NULL, 10);
+ enum oblika oblika = argv[7][0] == 'p' || argv[7][0] == 'P' ? PGM : CSV;
+ struct vektor merilno_mesto = { // krajevni vektor
+ .k = 0
+ };
+ if (oblika == CSV)
+ error(2, 0, "CSV oblika še ni implementirana.");
+ printf("P5 %u %u 255\n", koliko*2+1, koliko*2+1);
+ struct vektor Rpolovic = {
+ .i = R/2,
+ .j = 0,
+ .k = 0
+ };
+ for (int i = -koliko; i <= koliko; i++) {
+ merilno_mesto.i = i*razmak;
+ for (int j = -koliko; j <= koliko; j++) {
+ merilno_mesto.j = j*razmak;
+ unsigned long long int out =
+ 1000*absolutno(seštej(
+ množi(
+ množi(
+ tuljava(
+ R,
+ kotov,
+ seštej(
+ merilno_mesto,
+ Rpolovic
+ )
+ ),
+ n
+ ),
+ I
+ ),
+ množi(
+ množi(
+ tuljava(
+ R,
+ kotov,
+ seštej(
+ merilno_mesto,
+ množi(
+ Rpolovic,
+ -1
+ )
+ )
+ ),
+ n
+ ),
+ I
+ )
+ ));
+ if (out > 255)
+ putchar(255);
+ else
+ putchar(out);
+ }
+ }
+ return 0;
+}