Skriptet är inte det vackraste men det fungerar (kanske:). Skriptet fungerar så här:
Den läser in en Excel-fil med motståndsserier:
Kod: Markera allt
"Motstånd.xls"
E12    Hemma
10      10
12     56
15     200
21     470
27     560
33     1200
39     1500
47     2000
56     ...
68
82
...
Man ändar:
Namnet på serien man vill använda tex. 'Hemma'.
Uttrycket man vill beräkna (i string format). Tex om man vill beräkna en icke-inverterande op så skriver man '1+( Hemma(i) / Hemma(j))'.
Vilken förstärkning man vill ha tex. 9.5 ggr.
Sen kan man ange en tolerans på svaren tex. +/- 1 %
Man anger även min och max resistanser om man inte vill använda hela serien.
Sen är det bara att köra igång skriptet. Man kan använda upp till 4 variabler i uttrycket. Det är nog bara fantasin, tiden och Matlab som sätter begränsningar i hur avancerat uttrycket kan vara.
Kod: Markera allt
%MATLAB skript:
clear 
clc
tic
%%%%%%%%%%%%%%%%% EDIT %%%%%%%%%%%%%%%%%%%%%%%%%%%%%
[ndata, headertext] = xlsread('Motstånd.xls'); % Excel file with the resistor series. example: [ndata, headertext] = xlsread('Motstånd.xls')
Serie='E12'; %Name of the series you want to use example: Serie='E12';
uttryck='1+(E12(i)/E12(j))'; %Writh the expresion example: uttryck='(E12(i)+ E12(j))/E12(k)'; The script supports up to 4 varibles, i,j,k,l
AntalTal=2; % number of varibles
Amplification=9.5; % The result for the expresion
tolerans=1; % Tolerance for the result in +/-%
minresistance=100;  %Min Resistance 
maxresistance=1000000; %Max Resistance 
%%%%%%%%%%%%%%%%% END EDIT %%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%result=zeros(1, AntalTal+2);
r=1;
f=['i' 'j' 'k' 'l' 'm' 'n' 'o' 'p'];
min=NaN;
max=NaN;
for i=1:length(ndata(1,:))
    assignin('base',cell2mat(headertext(:,i)),ndata(:,i)');    
    eval([cell2mat(headertext(:,i)) '=' cell2mat(headertext(:,i)) '(~isnan(' cell2mat(headertext(:,i)) '));']);
end
for i=1:length(eval(Serie))
    if  (eval([Serie '(' num2str(i) ')'])>=minresistance) & isnan(min)
        min=i;
    end
    if  (eval([Serie '(' num2str(i) ')'])>=maxresistance) & isnan(max)
        max=i;
    end
end
if isnan (max) & ~isnan(min)
    eval([Serie '=' Serie '(' num2str(min) ':length(' Serie  '));']);
elseif isnan (min) & ~isnan(max)
    eval([Serie '=' Serie '(1:' num2str(max) ');']);
elseif isnan(min) & isnan(max)
    eval([Serie '=' Serie '(1:length(' Serie  '));']);
else
    eval([Serie '=' Serie '(' num2str(min) ':' num2str(max) ');']);
end
l=0;
tolupper=(Amplification + Amplification*tolerans/100)
tollower=(Amplification - Amplification*tolerans/100)
while l<length(eval(Serie))
    k=0;
    l=l+1;
    while k<length(eval(Serie))
        j=0; 
        k=k+1;
        while j<length(eval(Serie))
            i=0;
            j=j+1;
           while i <length(eval(Serie))      
            i=i+1;
            if (AntalTal==2)
                l=length(eval(Serie));
                k=length(eval(Serie));
            elseif (AntalTal==3)
                l=length(eval(Serie));
            end
            ratio(l,k,j,i)=eval(uttryck); 
            if((ratio(l,k,j,i)<=tolupper) & (ratio(l,k,j,i)>=(tollower)))             
                 str='';
                 for a=1:AntalTal                            
                     str= [str Serie '(' f(a) ') ' ];    
                 end
                 result(r,:) =[eval([ '[' str ']']) 0 ratio(l,k,j,i)];
                 r=r+1;     
             end 
         end
     end
 end
end
toc
openvar('result')
Kod: Markera allt
3300	     390       9.4615
33000	    3900      9.4615
330000      39000	  9.4615
 
				


 synd bara att det var skrivet i matlab, annars hade man kanske kunnat använda det...
 synd bara att det var skrivet i matlab, annars hade man kanske kunnat använda det...   

