Código para Catenária

31 de Julho de 2010 at 20:30 (Bloco de Notas)

Bem, tinha planeado fazer isto há algum tempo — mais concretamente quando tivesse a minha nota final em Introdução aos Computadores e Programação (que é 19, já agora). Este código é basicamente o resultado de um trabalho de duas semanas cujo propósito era a criação de um programa (embora o Octave seja scrpting language) que calculasse os custos inerentes à construção de uma linha telefónica.

A razão principal é simplesmente como auxilio, não só para os meus caros colegas, mas também como um marcador para quem tem curiosidade no tema.

O código está escrito em GNU Octave (http://www.gnu.org/software/octave/) e é compatível com o Matlab. Mais tarde postarei uma versão do trabalho que levou à criação do código e a versão do código em C (uma desculpa para o praticar; se alguém poder optimizar agradecia). O código do Octave tem alguns “erros”, e quando digo isto, digo que haviam partes que podiam estar melhoradas em eficiência, embora, no geral, tudo funcione como devia. Os resultados estão todos certos e podem-se ajustar certos valores no programa em si. Recomendo que o dx seja sempre igual ou maior que 0.1, devido À eficiência da linguagem Octave. Os valores dos custos e referentes não recomendo mudar, devido aos “erros” que referi anteriormente.

Também tive outro trabalho que foi uma organização de uma base de dados — algo relativamente simples em relação ao MySQL que tanto odeio. Assim que tiver o meu tempo postarei.

kappa.m

function k = kappa(n_f,r_f,d_f,r_a,d_a,t)

% ----------
% Conversões
% ----------

r_f = 0.001 * r_f;
r_a = 0.001 * r_a;
d_f = 1000 * d_f;
d_a = 1000 * d_a;

% ----------
% Calculo da massa unitária dos fios electricos
% ----------

v_f = pi * r_f^2;
m_f = v_f * d_f * n_f;

% ----------
% Calculo da massa unitária do cabo de apoio
% ----------

v_a = pi * r_a^2;
m_a = v_a * d_a;

% ----------
% Calculo do peso unitário e do kappa
% ----------

w0 = (m_f + m_a) * 9.8;

k = w0 / t;

endfunction

caten.m

function d = caten(k,h)

e = 0.1;

j = 1;
Y(1,1) = 0;
Der1(1,1) = 0;
Der2(1,1) = k;
A(1,1) = 0;

while (Y(1,j) < h);
j = j + 1;
Y(1,j) = Y(1,j-1) + Der1(1,j-1)*e + (1/2) * (Der2(1,j-1))*(e^2);
Der1(1,j) = Der1(1,j-1) + Der2(1,j-1)*e;
Der2(1,j) = k * sqrt(1 + (Der1(1,j))^2);
A(1,j) = A(1,j-1) + e;
endwhile

d = A(1,j-1);

endfunction

c_caten.m

function c = c_caten(k,d)

e = 0.1;

Y(1,1) = 0;
Der1(1,1) = 0;
Der2(1,1) = k;
A(1,1) = 0;
c = 0;

for j = 2:((d/e)+1);
Y(1,j) = Y(1,j-1) + Der1(1,j-1)*e + (1/2) * (Der2(1,j-1))*(e^2);
Der1(1,j) = Der1(1,j-1) + Der2(1,j-1)*e;
Der2(1,j) = k * sqrt(1 + (Der1(1,j))^2);
A(1,j) = A(1,j-1) + e;
c = c + sqrt(e^2 + (Y(1,j)-Y(1,j-1))^2);
endfor

endfunction

custo.m

function c = c_caten(k,d)

e = 0.1;

Y(1,1) = 0;
Der1(1,1) = 0;
Der2(1,1) = k;
A(1,1) = 0;
c = 0;

for j = 2:((d/e)+1);
Y(1,j) = Y(1,j-1) + Der1(1,j-1)*e + (1/2) * (Der2(1,j-1))*(e^2);
Der1(1,j) = Der1(1,j-1) + Der2(1,j-1)*e;
Der2(1,j) = k * sqrt(1 + (Der1(1,j))^2);
A(1,j) = A(1,j-1) + e;
c = c + sqrt(e^2 + (Y(1,j)-Y(1,j-1))^2);
endfor

endfunction

mais_barata.m

function [i,j] = mais_barata(M)

m = min(min(M));

for r = 1:rows(M);
for c = 1:columns(M);
if (M(r,c) == m);
i = r;
j = c;
endif
endfor
endfor

endfunction

catenaria.m

function M = catenaria

P = [7, 1000; 8, 1100; 9, 1400; 10, 1700];
F = [9.6, 1.8; 4.0, 2.1; 1.5, 4.1];

for i = 1:4;
for j = 1:3;
M(i,j) = custo(15323,P(i,1),P(i,2),F(j,1),F(j,2));
endfor
endfor

endfunction

catenaria_final.m

function catenaria_final

% Calculo da matriz de custos e do menor custo

M = catenaria;

custo = min(min(M));

[i, j] = mais_barata(M);

% Determinação da altura do poste

p = i + 6;

% Determinação do tipo de cabo

if (j == 1);
cabo = "cobre";
d_f = 9.6;
elseif (j == 2);
cabo = "liga leve";
d_f = 4;
elseif (j == 3);
cabo = "liga extra-leve";
d_f = 1.5;
endif

% Calculo do kappa e dos restantes valores

k = kappa(100,1,d_f,2.5,8,3000);

[d,a] = caten_2(k,i); % O caten_2 calcula, alem da distância entre o ponto minimo da catenária e o poste, a altura minima entre o cabo e o solo
c = c_caten_2(k,d); % O c_caten_2 cria o plot da catenária

n_intervalos = ceil(15323/(d*2));
postes = n_intervalos + 1;

ct = n_intervalos * (c*2);

% Disp dos valores obtidos

printf("Melhor Projecto: \n \nnumero_de_postes_a_utilizar = '%g' \naltura_dos_postes = '%g' \ndistancia_entre_postes = '%g' \naltura_minima_ao_solo = '%g' \ncomprimento_do_cabo = '%g' \nmaterial_do_cabo = '%s' \ncusto_total_do_projecto = '%g' \n",postes,p,d*2,a,ct,cabo,custo);

endfunction

caten_2.m

function [d,a] = caten_2(k,h)

e = 0.1;

j = 1;
Y(1,1) = 0;
Der1(1,1) = 0;
Der2(1,1) = k;
A(1,1) = 0;

while (Y(1,j) < h);
j = j + 1;
Y(1,j) = Y(1,j-1) + Der1(1,j-1)*e + (1/2) * (Der2(1,j-1))*(e^2);
Der1(1,j) = Der1(1,j-1) + Der2(1,j-1)*e;
Der2(1,j) = k * sqrt(1 + (Der1(1,j))^2);
A(1,j) = A(1,j-1) + e;
endwhile

d = A(1,j-1);
a = (h - Y(1,j-1)) + 6; % Altura minima entre o cabo e o solo

endfunction

c_caten_2.m

function c = c_caten_2(k,d)

e = 0.1;

Y(1,1) = 0;
Der1(1,1) = 0;
Der2(1,1) = k;
A(1,1) = 0;
c = 0;

for j = 2:((d/e)+1);
Y(1,j) = Y(1,j-1) + Der1(1,j-1)*e + (1/2) * (Der2(1,j-1))*(e^2);
Der1(1,j) = Der1(1,j-1) + Der2(1,j-1)*e;
Der2(1,j) = k * sqrt(1 + (Der1(1,j))^2);
A(1,j) = A(1,j-1) + e;
c = c + sqrt(e^2 + (Y(1,j)-Y(1,j-1))^2);
endfor

plot(A,Y);

endfunction

Just run catenaria_final.m com todos os módulos e recebem os resultados. Todo o código aqui é disponibilizado gratuita e livremente, para propósitos educacionais e não-comerciais. O Autor não se responsabiliza de qualquer modo sobre quaisquer danos que o código possa fazer.

P.S.: Eu sei que o código aparece “mal” mas não posso evitar, é da UI que escolhi para o blogue.

Anúncios

Permalink 2 comentários

Tempos Idos, Tempos Passados

31 de Julho de 2010 at 1:24 (Reminiscências de um Louco)

Já faz algum tempo desde que publico alguma coisa no meu blogue. E também pouco tenho feito na blogosfera, digg-o-sfera, facebook (não sei se será esfera) ou reddit (que apenas passo por lá por causa do Twitter, que também pouco tenho usado, apenas para anunciar a minha aprendizagem de Octave, C, C++ e Java, os dois últimos por sequer começar, embora um pequeno passo para o C contribui para um grande passo para o C++. No entanto, divago).
Revistando isto tudo que aconteceu nos últimos digamos, 4 meses desde que algo foi publicado aqui, os remarks mais relevantes, no que toca ao meu mundo da Internet são estes:
A Catarina continua a postar no blogue dela, o Tiago estranhamente “caiu” e recentemente não consigo aceder à relíquia que é o seu blogue, o Cris divergiu muito do que na verdadeira essência devia ser um site de Física, mas compreendo perante o carácter dele.
O Death Note Forum deixei em paz assim como as minhas visualização periódicas de Manga, Anime e até (e por infelicidade) o Fringe — embora que, de certa forma compensei por ter acabado o Stargate Universe e o Star Trek: Enterprise, ambos preciosos momentos da ficção cientifica.
Aderi a um projecto de tradução, chamado TDArlete (Tradutor da Dona Arlete) que, embora nem a sigla nem o nome em si sejam explicativos, é um projecto de traduzir as quests existentes no World of Warcraft em Português. Um grande projecto, mas que no entanto começa pequeno.
Já remetendo ao World of Warcraft, após 2 anos de liderança, larguei o cargo de Guild Master da For The Horde. Eu sei que para 99% de vocês não deve importar nada, mas mesmo assim, planeio fazer um post explicando mais afincadamente as minhas razões.
Como a ultima coisa relevante que devo ter feito aos vossos olhos, postei a Wir An Freude no Facebook, o que suscitou comentários interessantes, mas nenhum (salvo talvez um) tenha referido a grandiosidade que é a 9ª Sinfonia de Beethoven, muito menos o significado que teve, já que foi imediatamente após ter acabado o meu ultimo teste — logo entrado em férias oficialmente — que postei o emblemático poema.

Então…….
……..porque é que não postei nada até hoje?

A resposta chega a ser simples e no mesmo tempo complexa. Estando sobrecarregado com a insanidade que é a época normal de exames, pouco ou nenhum olhar poderia dar na internet (a não ser para descansar um pouco e jogar um pouco de WoW). De facto, a maneira como as coisas se entrelaçavam uma após outra tornavam passar tempo na Internet proibitivo — de tal modo que escrever qualquer post se tornava uma obrigação, não um prazer.
A altura em que mais tive vontade de escrever foi aquando da morte de José Saramago, um autor que, embora apenas tenha lido o Memorial do Convento (e tendo em conta os meus hábitos literários, será longe deste momento que me atreverei a ler um livro em português, salvo os técnicos…) considero que a sua perícia na escrita é algo que dificilmente será replicado.
Uma parte que me arrependo um pouco é a falta quase absoluta de contacto com os meus antigos colegas, mesmo eles estando à distancia de um clique. Deveras, sempre prefiro o contacto físico, embora que, estranhamente, não o procure — os únicos sítios onde encontraria o Tiago ou o Rafael, meus grandes colegas, seria no metro; e isto se tivesse a sorte ou azar de ficar na faculdade a acabar um trabalho, já que a intersecção matemática dos nossos horários é mínima, no máximo.

Bem, por agora, vou tentar mudar as coisas ligeiramente. Esperando partir em breve para um Norte cada vez mais quente, e principalmente sem esta calculadora gigantesca, tenho de acabar o que deixei pendente.

Ler Manga, ver Anime, degustar Fringe…tudo parte de um pequeno descanso que tenho onde, com sorte posso contactar a maioria dos meus colegas, em ânsia de reganhar o que pelas brumas do tempo passou ao lado.

Um pequeno relato do que agora estou a fazer, estou a ler um livro: World Of Warcraft – War of The Ancients: The Demon Soul e, por mais estranho ou engraçado que seja, está a ser bom……… agora se tivesse começado do inicio, mas é o que dá pela trilogia não vir junta. Maldita Fnac.

Permalink Deixe um Comentário