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

2 comentários

  1. tambem fiz a catenaria e nao a publiquei said,

    Tu es totalmente apanhado. Que interessa isto? Achas que ha pessoas que precisam de ler esta merda? Tambem fiz ICP e nao publiquei tudo o que consegui. Nao es nenhum genio, senao nao te chamarias Grande Urso.

    • reichardkaigun said,

      Se lesses o perfil que introduzi da minha pessoa, perceberias porque o nome do blogue é “O Blogue do Grande Urso” e, se tivessem um pouco de memória, também saberiam de onde veio a alcunha de praxes (até devo ter falado desse engano aqui algures).

      Que interessa isto?
      Consegui fazer algo que funciona, e que pode dar jeito a pessoas que precisem de fazer estes cálculos, quer sejam de Eng. Civil ou outrem.
      Se acho que há pessoas que precisem de ler este post?
      Duvido, mas ai estou a ter em conta que ter Internet não é uma necessidade básica da nossa existência. As pessoas lêem o que quiserem, que pressuponho que foi o que tentaste fazer ao ver isto.

      Ninguem te manda publicares o que fizeste em ICP, verdade. Fiz isto de bom gosto e de apreço pelas artes informáticas. Se sou um génio ou não, apenas o futuro dirá, mas em retrospectiva, como fiquei a saber que grande parte do código dos meus colegas proveio de uma aplicação minha (do 2º trabalho, e que mal usada ia dar erros), penso ser dos pouco a ter feito algo de jeito.

Deixe uma Resposta

Preencha os seus detalhes abaixo ou clique num ícone para iniciar sessão:

Logótipo da WordPress.com

Está a comentar usando a sua conta WordPress.com Terminar Sessão / Alterar )

Imagem do Twitter

Está a comentar usando a sua conta Twitter Terminar Sessão / Alterar )

Facebook photo

Está a comentar usando a sua conta Facebook Terminar Sessão / Alterar )

Google+ photo

Está a comentar usando a sua conta Google+ Terminar Sessão / Alterar )

Connecting to %s

%d bloggers like this: