मुझे एक फोरट्रान प्रोग्राम को मैटलैब में बदलना है और मुझे एक समस्या का सामना करना पड़ रहा है। हालांकि जब मैं मैटलैब स्क्रिप्ट अटक जाता हूं तो फोरट्रान परिणाम सही होते हैं। मेरा मानना ​​है कि समस्या पहले IF स्टेटमेंट में है। क्या मुझे अपने मैटलैब रूपांतरण में कुछ याद आ रहा है? अग्रिम में धन्यवाद।

यह फोरट्रान और मैटलैब दोनों में परिणामों के साथ पूरा कार्यक्रम है। नवीनतम संस्करण @Rotem का समाधान है। मैंने, f1 और f2 में फिक्स जोड़ने की कोशिश की, जैसा कि @BenBarrowes ने उल्लेख किया है, लेकिन प्रोग्राम फिर से अटक गया। अग्रिम में धन्यवाद :)

फोरट्रान संस्करण

program asxm_2
implicit none
real(8) a,b, par1, sum,sum1,sum2, x,x1,x2, h, f,fa,fb,f1,f2,par2,e
integer n,j,y,k
real(8), allocatable, dimension (:) :: partitionS, valueS, errorS
a=0.
b=5.+85
par1=100*(atan(b)-atan(a)) 
fa=100/(1+a**2) 
fb=100/(1+b**2) 

print*, 'METHOD SIMPSON'
do n=1,1000000
    h=(b-a)/n
    sum1=0. 
    sum2=0. 
    x1=a 
    x2=a 
    do j=1,n-1 
        k=j 
        if(k/2/=j/2.) then 
            if(j==1) x1=x1+h 
            if(j>1) x1=x1+2*h 

            f1=100/(1+x1**2)
            sum1=sum1+f1
        else
            x2=x2+2*h 
            f2=100/(1+x2**2) 
            sum2=sum2+f2
        endif
    enddo
    par2= (h/3)*(fa+4*sum1+2*sum2+fb) 
    e=par1-par2
    if(abs(e)<=0.001) exit
enddo

y=n 
allocate(partitionS(y),valueS(y), errorS(y))
do n=1,y
     h=(b-a)/n
     sum1=0.
     sum2=0.
     x1=a
     x2=a
     do j=1,n-1
         k=j
         if(k/2==j/2.) then
             x2=x2+2*h
             f2=100/(1+x2**2)
             sum2=sum2+f2
         else
             if(j==1) x1=x1+h
             if(j>1) x1=x1+2*h
             f1=100/(1+x1**2)
             sum1=sum1+f1
         endif
     enddo
     partitionS(n)=n 
     valueS(n)= (h/3)*(fa+4*sum1+2*sum2+fb) 
     errorS(n)=par1-valueS(n)
 enddo
 print*, 'Below are the results'
 print*, partitionS(y), valueS(y), errorS(y)
 deallocate(partitionS, valueS, errorS)
 end

फोरट्रान परिणाम

Below are the results
332.00000000000000        155.96759681601489        9.7047371403391480E-004

Matlab संस्करण

a = 0;
b = 5.+85;
par1 = 100*(atan(b)-atan(a));
fa = 100/(1+a.^2);
fb = 100/(1+b.^2);

fprintf('METHOD SIMPSON\n');
for n = 1:1000000
    h=(b-a)/n;
    sum1=0;
    sum2=0;
    x1 = a;
    x2 = a;
    for j = 1:n-1
        k = j;
        if fix(k/2) ~= j/2 
            if j == 1
                x1 = x1+h;
            end
            if j > 1
                x1 = x1+2*h;
            end   
            f1 = 100/(1+x1.^2);
            sum1 = sum1 + f1;
        else
            x2 = x2+2*h;
            f2 = 100/(1+x2.^2);
            sum2 = sum2 + f2;
        end
    end
    par2 = (h/3)*(fa+4*sum1+2*sum2+fb);
    e = par1 - par2;
    if abs(e)<0.001
        break;
    end
end



y=n;
partitionS = zeros (n);
valueS= zeros (n);
errorS = zeros (n);


for n = 1:y
    h=(b-a)/n;
    sum1=0;
    sum2=0;
    x1=a;
    x2=a;
    for j = 1:n-1
        k = j;
        if fix(k/2) == j/2
            x2 = x2 + 2*h;
            f2 = 100/(1+x2.^2);
            sum2 = sum2 + f2;
        else
            if j == 1
                x1 = x1 + h;
            end
            if j > 1
                x1 = x1 + 2*h;
            end
            f1 = 100/(1+x2.^2);
            sum1 = sum1 + f1;
        end
    end
    partitionS(n) = n;
    valueS(n)= (h/3)*(fa+4*sum1+2*sum2+fb);
    errorS(n)=par1-valueS(n);
end

fprintf('Below are the results\n');
fprintf('%.25f\n',partitionS(n));
fprintf('%.25f\n',valueS(n));
fprintf('%.25f\n',errorS(n));

MATLAB परिणाम

Below are the results
332.0000000000000000000000000
174.0415303853845900000000000
-18.0729630956556660000000000

1
ktsigkounis 25 मार्च 2017, 23:09

2 जवाब

सबसे बढ़िया उत्तर

जैसे फ्रांसेस्कलस ने टिप्पणी की, ऐसा लगता है कि समस्या फोरट्रान में पूर्णांक अंकगणित से संबंधित है।

आप मैटलैब कार्यान्वयन में पहले if कथन को निम्नानुसार संशोधित कर सकते हैं:

if fix(k/2) ~= j/2

आपके दूसरे भाग में, मैटलैब कोड में टंकण त्रुटि है।
आपने x1 के बजाय x2 लिखा।

सही कोड:

f1 = 100/(1+x1.^2); %Instead of f1 = 100/(1+x2.^2);

मामूली दोष:

if abs(e)<=0.001 %Instead of if abs(e)<0.001

मैं बहुत ही बुनियादी फोरट्रान जानता हूं, इसलिए मैंने मैटलैब और फोरट्रान कोड दोनों संस्करणों को साथ-साथ निष्पादित किया।
मैंने डीबगर का उपयोग करके कोड को चरण दर चरण निष्पादित किया।
मैंने कुछ मनमाना इनपुट मानों का उपयोग किया।

समस्या पहले फोरट्रान if कथन से संबंधित है: (k/2/=j/2.)
जब k एक पूर्णांक हो k/2 का मूल्यांकन floor(k/2) होता है, और j/2. का मूल्यांकन फ़्लोटिंग पॉइंट पर होता है (मान लें कि k सकारात्मक है)।
(मैंने k के मामले में फिक्स मैटलैब फ़ंक्शन का उपयोग किया है। नकारात्मक भी हो सकता है)।

उदाहरण:

integer j, k
j=3
k=3

print *, k/2
print *, j/2.
print *, k/2/=j/2.

नतीजा:

           1
   1.500000
 T

मैटलैब में, डिफ़ॉल्ट प्रकार डबल है।

j=3;
k=3;

disp(k/2)
disp(j/2)
disp(k/2 ~= j/2)

नतीजा:

1.5000

1.5000

 0

जैसा कि आप देख सकते हैं, फोरट्रान की स्थिति में सत्य और मैटलैब में गलत का मूल्यांकन किया जाता है।


पूरा मैटलैब कोड:

a = 0;
b = 5.+85;
par1 = 100*(atan(b)-atan(a));
fa = 100/(1+a.^2);
fb = 100/(1+b.^2);

fprintf('METHOD SIMPSON\n');
for n = 1:1000000
    h=(b-a)/n;
    sum1=0;
    sum2=0;
    x1 = a;
    x2 = a;
    for j = 1:n-1
        k = j;
        if fix(k/2) ~= j/2 
            if j == 1
                x1 = x1+h;
            end
            if j > 1
                x1 = x1+2*h;
            end   
            f1 = 100/(1+x1.^2);
            sum1 = sum1 + f1;
        else
            x2 = x2+2*h;
            f2 = 100/(1+x2.^2);
            sum2 = sum2 + f2;
        end
    end
    par2 = (h/3)*(fa+4*sum1+2*sum2+fb);
    e = par1 - par2;
    if abs(e)<=0.001
        break;
    end
end



y=n;
partitionS = zeros (n);
valueS= zeros (n);
errorS = zeros (n);


for n = 1:y
    h=(b-a)/n;
    sum1=0;
    sum2=0;
    x1=a;
    x2=a;
    for j = 1:n-1
        k = j;
        if fix(k/2) == j/2
            x2 = x2 + 2*h;
            f2 = 100/(1+x2.^2);
            sum2 = sum2 + f2;
        else
            if j == 1
                x1 = x1 + h;
            end
            if j > 1
                x1 = x1 + 2*h;
            end
            f1 = 100/(1+x1.^2);%f1 = 100/(1+x2.^2);
            sum1 = sum1 + f1;
        end
    end
    partitionS(n) = n;
    valueS(n)= (h/3)*(fa+4*sum1+2*sum2+fb);
    errorS(n)=par1-valueS(n);
end

fprintf('Below are the results\n');
fprintf('%.25f\n',partitionS(n));
fprintf('%.25f\n',valueS(n));
fprintf('%.25f\n',errorS(n));

मैटलैब आउटपुट:

METHOD SIMPSON
Below are the results
332.0000000000000000000000000
155.9675968160148900000000000
0.0009704737140339148000000
2
Rotem 26 मार्च 2017, 19:42

मैंने आपकी पोस्ट के आधार पर एक छोटा सा फोरट्रान प्रोग्राम बनाया है। फिर इसे मेरे f2matlab फोरट्रान स्रोत के माध्यम से matlab स्रोत कनवर्टर (matlab फ़ाइल एक्सचेंज) में डाल दें। यहाँ फोरट्रान है:

program kt_f
implicit none
integer j,n,k,f1,f2
real x1,x2,h,sum1,sum2

n=100
k=50

do j=1,n-1
 k=j
 if(k/2/=j/2.) then
  if(j==1) x1=x1+h
  if(j>1) x1=x1+2*h
  f1=100/(1+x1**2)
  sum1=sum1+f1
 else
  x2=x2+2*h
  f2=100/(1+x2**2)
  sum2=sum2+f2
 endif
enddo

print *,'sum1=',sum1
print *,'sum2=',sum2

end program kt_f

जब मैं इसे संकलित और चलाता हूं, तो आउटपुट होता है:

sum1=   5000.000    
sum2=   4900.000 

यहां मैटलैब स्रोत का उत्पादन किया गया है। ध्यान दें कि अगर कथन में fix के अतिरिक्त, आपको 100/ के साथ पंक्ति में एक और fix की आवश्यकता है क्योंकि यह एक पूर्णांक विभाजन भी है। यहाँ मैटलैब कोड है:

function kt_f(varargin)
 clear global; clear functions;
 global GlobInArgs nargs
 GlobInArgs={mfilename,varargin{:}}; nargs=nargin+1;
 persistent f1 f2 h_fv j k n sum1 sum2 x1 x2 ; 

 if isempty(f1), f1=0; end;
 if isempty(f2), f2=0; end;
 if isempty(h_fv), h_fv=0; end;
 if isempty(j), j=0; end;
 if isempty(k), k=0; end;
 if isempty(n), n=0; end;
 if isempty(sum1), sum1=0; end;
 if isempty(sum2), sum2=0; end;
 if isempty(x1), x1=0; end;
 if isempty(x2), x2=0; end;

 n = 100;
 k = 50;

 for j = 1: n - 1;
  k = fix(j);
  if(fix(k./2) ~= (j./2.));
   if(j == 1);
    x1 = x1 + h_fv;
   end;
   if(j > 1);
    x1 = x1 + 2.*h_fv;
   end;
   f1 = fix(100./(1+x1.^2));
   sum1 = sum1 + f1;
  else;
   x2 = x2 + 2.*h_fv;
   f2 = fix(100./(1+x2.^2));
   sum2 = sum2 + f2;
  end;
 end;

'sum1=',sum1
'sum2=',sum2
end %program kt_f

यह फोरट्रान के समान आउटपुट देता है। कृपया जांचें और देखें कि क्या यह आपकी समस्या का समाधान करता है।

1
Ben Barrowes 26 मार्च 2017, 14:31