Differences

This shows you the differences between two versions of the page.

Link to this comparison view

linear_interpolation [2010/11/14 18:33] (current)
pac079 created
Line 1: Line 1:
 +====== Linear interpolation background functions ======
 +A set of linear interpolation background functions, similar to GSAS background function 7 (p130 of GSAS manual), with 6, 12, 24 and 36 parameters.
 +The function splits the pattern into N equal segments with N+1 refined background intensity points with straight lines describing the background between each point.
 +These functions use nested IF loops to significantly decrease the calculation time compared to subsequent IF statements.
 +The macros can be used to draw your own background by fixing the background intensity values at the observed value...
 +e.g. Bkg_LinInterpol_N6(!bk0,​ 370, !bk1, 309, !bk2, 171, !bk3, 88, !bk4, 72, !bk5, 42, !bk6, 30)
 +...or just used to refine even the most tricky of backgrounds which are not well served by gradually changing mathematical functions.
 +Example of use: Bkg_LinInterpol_N36(bk0,​ 0, bk1, 500, bk2, 0, bk3, 500, bk4, 0, bk5, 500, bk6, 0, bk7, 500, bk8, 0, bk9, 500, bk10, 0, bk11, 500, bk12, 0, bk13, 500, bk14, 0, bk15, 500, bk16, 0, bk17, 500, bk18, 0, bk19, 500, bk20, 0, bk21, 500, bk22, 0, bk23, 500, bk24, 0, bk25, 500, bk26, 0, bk27, 500, bk28, 0, bk29, 500, bk30, 0, bk31, 500, bk32, 0, bk33, 500, bk34, 0, bk35, 500, bk36, 0)
  
 +Linear interpolation background function with 6 parameters
 +<code topas>​macro Bkg_LinInterpol_N6(bk0,​ b0v, bk1, b1v, bk2, b2v, bk3, b3v, bk4, b4v, bk5, b5v, bk6, b6v)
 +{
 +prm pStep =((X*0)+X2-X1)/​6;​
 +prm pStart =((X*0)+X1);​
 +prm Xval0 = pStart;
 +prm Xval1 = pStart+pStep;​
 +prm Xval2 = pStart+(pStep*2);​
 +prm Xval3 = pStart+(pStep*3);​
 +prm Xval4 = pStart+(pStep*4);​
 +prm Xval5 = pStart+(pStep*5);​
 +
 +   prm bk0  b0v
 + prm bk1  b1v
 +   prm bk2  b2v
 +   prm bk3  b3v
 +   prm bk4  b4v
 +   prm bk5  b5v
 +   prm bk6  b6v
 +
 +fit_obj =
 + IF (X < Xval3) THEN
 + IF (X < Xval1) THEN
 + ((bk1-bk0)/​pStep)*(X-Xval0)+bk0
 + ELSE IF (X < Xval2) THEN
 + ((bk2-bk1)/​pStep)*(X-Xval1)+bk1
 + ELSE
 + ((bk3-bk2)/​pStep)*(X-Xval2)+bk2
 + ENDIF
 + ENDIF
 + ELSE IF (X < Xval4) THEN
 + ((bk4-bk3)/​pStep)*(X-Xval3)+bk3
 + ELSE IF (X < Xval5) THEN
 + ((bk5-bk4)/​pStep)*(X-Xval4)+bk4
 + ELSE
 + ((bk6-bk5)/​pStep)*(X-Xval5)+bk5
 +ENDIF
 +ENDIF
 +ENDIF
 +;
 +}</​code>​
 +
 +Linear interpolation background function with 12 parameters
 +<code topas>​macro Bkg_LinInterpol_N12(bk0,​ b0v, bk1, b1v, bk2, b2v, bk3, b3v, bk4, b4v, bk5, b5v, bk6, b6v, bk7, b7v, bk8, b8v, bk9, b9v, bk10, b10v, bk11, b11v, bk12, b12v)
 +{
 +prm pStep =((X*0)+X2-X1)/​12;​
 +prm pStart =((X*0)+X1);​
 +prm Xval0 = pStart; ​             prm Xval6 = pStart+(pStep*6);​
 +prm Xval1 = pStart+pStep; ​       prm Xval7 = pStart+(pStep*7);​
 +prm Xval2 = pStart+(pStep*2); ​   prm Xval8 = pStart+(pStep*8);​
 +prm Xval3 = pStart+(pStep*3); ​   prm Xval9 = pStart+(pStep*9);​
 +prm Xval4 = pStart+(pStep*4); ​   prm Xval10 = pStart+(pStep*10);​
 +prm Xval5 = pStart+(pStep*5); ​   prm Xval11 = pStart+(pStep*11);​
 +
 +   prm bk0  b0v prm bk7  b7v
 + prm bk1  b1v   prm bk8  b8v
 +   prm bk2  b2v   prm bk9  b9v
 +   prm bk3  b3v   prm bk10  b10v
 +   prm bk4  b4v   prm bk11  b11v
 +   prm bk5  b5v   prm bk12  b12v
 +   prm bk6  b6v
 +
 +fit_obj =
 + IF (X < Xval6) THEN
 + IF (X < Xval3) THEN
 + IF (X < Xval1) THEN
 + ((bk1-bk0)/​pStep)*(X-Xval0)+bk0
 + ELSE IF (X < Xval2) THEN
 + ((bk2-bk1)/​pStep)*(X-Xval1)+bk1
 + ELSE
 + ((bk3-bk2)/​pStep)*(X-Xval2)+bk2
 + ENDIF
 + ENDIF
 + ELSE
 + IF (X < Xval4) THEN
 + ((bk4-bk3)/​pStep)*(X-Xval3)+bk3
 + ELSE IF (X < Xval5) THEN
 + ((bk5-bk4)/​pStep)*(X-Xval4)+bk4
 + ELSE
 + ((bk6-bk5)/​pStep)*(X-Xval5)+bk5
 + ENDIF
 + ENDIF
 + ENDIF
 + ELSE
 + IF (X < Xval9) THEN
 + IF (X < Xval7) THEN
 + ((bk7-bk6)/​pStep)*(X-Xval6)+bk6
 + ELSE IF (X < Xval8) THEN
 + ((bk8-bk7)/​pStep)*(X-Xval7)+bk7
 + ELSE
 + ((bk9-bk8)/​pStep)*(X-Xval8)+bk8
 + ENDIF
 + ENDIF
 + ELSE
 + IF (X < Xval10) THEN
 + ((bk10-bk9)/​pStep)*(X-Xval9)+bk9
 + ELSE IF (X < Xval11) THEN
 + ((bk11-bk10)/​pStep)*(X-Xval10)+bk10
 + ELSE
 + ((bk12-bk11)/​pStep)*(X-Xval11)+bk11
 + ENDIF
 + ENDIF
 + ENDIF
 + ENDIF
 +;
 +}</​code>​
 +
 +Linear interpolation background function with 24 parameters
 +<code topas>​macro Bkg_LinInterpol_N24(bk0,​ b0v, bk1, b1v, bk2, b2v, bk3, b3v, bk4, b4v, bk5, b5v, bk6, b6v, bk7, b7v, bk8, b8v, bk9, b9v, bk10, b10v, bk11, b11v, bk12, b12v, bk13, b13v, bk14, b14v, bk15, b15v, bk16, b16v, bk17, b17v, bk18, b18v, bk19, b19v, bk20, b20v, bk21, b21v, bk22, b22v, bk23, b23v, bk24, b24v)
 +{
 +prm pStep =((X*0)+X2-X1)/​24;​
 +prm pStart =((X*0)+X1);​
 +prm Xval0 = pStart; ​               prm Xval12 = pStart+(pStep*12);​
 +prm Xval1 = pStart+pStep; ​         prm Xval13 = pStart+(pStep*13);​
 +prm Xval2 = pStart+(pStep*2); ​     prm Xval14 = pStart+(pStep*14);​
 +prm Xval3 = pStart+(pStep*3); ​     prm Xval15 = pStart+(pStep*15);​
 +prm Xval4 = pStart+(pStep*4); ​     prm Xval16 = pStart+(pStep*16);​
 +prm Xval5 = pStart+(pStep*5); ​     prm Xval17 = pStart+(pStep*17);​
 +prm Xval6 = pStart+(pStep*6); ​     prm Xval18 = pStart+(pStep*18);​
 +prm Xval7 = pStart+(pStep*7); ​     prm Xval19 = pStart+(pStep*19);​
 +prm Xval8 = pStart+(pStep*8); ​     prm Xval20 = pStart+(pStep*20);​
 +prm Xval9 = pStart+(pStep*9); ​     prm Xval21 = pStart+(pStep*21);​
 +prm Xval10 = pStart+(pStep*10); ​   prm Xval22 = pStart+(pStep*22);​
 +prm Xval11 = pStart+(pStep*11); ​   prm Xval23 = pStart+(pStep*23); ​
 +
 +   prm bk0  b0v   prm bk10  b10v  prm bk20  b20v
 + prm bk1  b1v   prm bk11  b11v  prm bk21  b21v
 +   prm bk2  b2v   prm bk12  b12v  prm bk22  b22v
 +   prm bk3  b3v   prm bk13  b13v  prm bk23  b23v
 +   prm bk4  b4v   prm bk14  b14v  prm bk24  b24v
 +   prm bk5  b5v   prm bk15  b15v  ​
 +   prm bk6  b6v   prm bk16  b16v  ​
 + prm bk7  b7v   prm bk17  b17v  ​
 +   prm bk8  b8v   prm bk18  b18v  ​
 +   prm bk9  b9v   prm bk19  b19v  ​
 +
 +fit_obj =
 + IF (X < Xval12) THEN
 + IF (X < Xval6) THEN
 + IF (X < Xval3) THEN
 + IF (X < Xval1) THEN
 + ((bk1-bk0)/​pStep)*(X-Xval0)+bk0
 + ELSE IF (X < Xval2) THEN
 + ((bk2-bk1)/​pStep)*(X-Xval1)+bk1
 + ELSE
 + ((bk3-bk2)/​pStep)*(X-Xval2)+bk2
 + ENDIF
 + ENDIF
 + ELSE
 + IF (X < Xval4) THEN
 + ((bk4-bk3)/​pStep)*(X-Xval3)+bk3
 + ELSE IF (X < Xval5) THEN
 + ((bk5-bk4)/​pStep)*(X-Xval4)+bk4
 + ELSE
 + ((bk6-bk5)/​pStep)*(X-Xval5)+bk5
 + ENDIF
 + ENDIF
 + ENDIF
 + ELSE
 + IF (X < Xval9) THEN
 + IF (X < Xval7) THEN
 + ((bk7-bk6)/​pStep)*(X-Xval6)+bk6
 + ELSE IF (X < Xval8) THEN
 + ((bk8-bk7)/​pStep)*(X-Xval7)+bk7
 + ELSE
 + ((bk9-bk8)/​pStep)*(X-Xval8)+bk8
 + ENDIF
 + ENDIF
 + ELSE
 + IF (X < Xval10) THEN
 + ((bk10-bk9)/​pStep)*(X-Xval9)+bk9
 + ELSE IF (X < Xval11) THEN
 + ((bk11-bk10)/​pStep)*(X-Xval10)+bk10
 + ELSE
 + ((bk12-bk11)/​pStep)*(X-Xval11)+bk11
 + ENDIF
 + ENDIF
 + ENDIF
 + ENDIF
 + ELSE
 + IF (X < Xval18) THEN
 + IF (X < Xval15) THEN
 + IF (X < Xval13) THEN
 + ((bk13-bk12)/​pStep)*(X-Xval12)+bk12
 + ELSE IF (X < Xval14) THEN
 + ((bk14-bk13)/​pStep)*(X-Xval13)+bk13
 + ELSE
 + ((bk15-bk14)/​pStep)*(X-Xval14)+bk14
 + ENDIF
 + ENDIF
 + ELSE
 + IF (X < Xval16) THEN
 + ((bk16-bk15)/​pStep)*(X-Xval15)+bk15
 + ELSE IF (X < Xval17) THEN
 + ((bk17-bk16)/​pStep)*(X-Xval16)+bk16
 + ELSE
 + ((bk18-bk17)/​pStep)*(X-Xval17)+bk17
 + ENDIF
 + ENDIF
 + ENDIF
 + ELSE
 + IF (X < Xval21) THEN
 + IF (X < Xval19) THEN
 + ((bk19-bk18)/​pStep)*(X-Xval18)+bk18
 + ELSE IF (X < Xval20) THEN
 + ((bk20-bk19)/​pStep)*(X-Xval19)+bk19
 + ELSE
 + ((bk21-bk20)/​pStep)*(X-Xval20)+bk20
 + ENDIF
 + ENDIF
 + ELSE
 + IF (X < Xval22) THEN
 + ((bk22-bk21)/​pStep)*(X-Xval21)+bk21
 + ELSE IF (X < Xval23) THEN
 + ((bk23-bk22)/​pStep)*(X-Xval22)+bk22
 + ELSE
 + ((bk24-bk23)/​pStep)*(X-Xval23)+bk23
 + ENDIF
 + ENDIF
 + ENDIF
 + ENDIF
 + ENDIF
 +;
 +}</​code>​
 +
 +Linear interpolation background function with 36 parameters
 +<code topas>​macro Bkg_LinInterpol_N36(bk0,​ b0v, bk1, b1v, bk2, b2v, bk3, b3v, bk4, b4v, bk5, b5v, bk6, b6v, bk7, b7v, bk8, b8v, bk9, b9v, bk10, b10v, bk11, b11v, bk12, b12v, bk13, b13v, bk14, b14v, bk15, b15v, bk16, b16v, bk17, b17v, bk18, b18v, bk19, b19v, bk20, b20v, bk21, b21v, bk22, b22v, bk23, b23v, bk24, b24v, bk25, b25v, bk26, b26v, bk27, b27v, bk28, b28v, bk29, b29v, bk30, b30v, bk31, b31v, bk32, b32v, bk33, b33v, bk34, b34v, bk35, b35v, bk36, b36v)
 +{
 +prm pStep =((X*0)+X2-X1)/​36;​
 +prm pStart =((X*0)+X1);​
 +prm Xval0 = pStart; ​              prm Xval12 = pStart+(pStep*12); ​   prm Xval24 = pStart+(pStep*24);​
 +prm Xval1 = pStart+pStep; ​        prm Xval13 = pStart+(pStep*13); ​   prm Xval25 = pStart+(pStep*25);​
 +prm Xval2 = pStart+(pStep*2); ​    prm Xval14 = pStart+(pStep*14); ​   prm Xval26 = pStart+(pStep*26);​
 +prm Xval3 = pStart+(pStep*3); ​    prm Xval15 = pStart+(pStep*15); ​   prm Xval27 = pStart+(pStep*27);​
 +prm Xval4 = pStart+(pStep*4); ​    prm Xval16 = pStart+(pStep*16); ​   prm Xval28 = pStart+(pStep*28);​
 +prm Xval5 = pStart+(pStep*5); ​    prm Xval17 = pStart+(pStep*17); ​   prm Xval29 = pStart+(pStep*29);​
 +prm Xval6 = pStart+(pStep*6); ​    prm Xval18 = pStart+(pStep*18); ​   prm Xval30 = pStart+(pStep*30);​
 +prm Xval7 = pStart+(pStep*7); ​    prm Xval19 = pStart+(pStep*19); ​   prm Xval31 = pStart+(pStep*31);​
 +prm Xval8 = pStart+(pStep*8); ​    prm Xval20 = pStart+(pStep*20); ​   prm Xval32 = pStart+(pStep*32);​
 +prm Xval9 = pStart+(pStep*9); ​    prm Xval21 = pStart+(pStep*21); ​   prm Xval33 = pStart+(pStep*33);​
 +prm Xval10 = pStart+(pStep*10); ​  prm Xval22 = pStart+(pStep*22); ​   prm Xval34 = pStart+(pStep*34);​
 +prm Xval11 = pStart+(pStep*11); ​  prm Xval23 = pStart+(pStep*23); ​   prm Xval35 = pStart+(pStep*35);​
 +
 +   prm bk0  b0v prm bk10  b10v   prm bk20  b20v   prm bk30  b30v
 + prm bk1  b1v prm bk11  b11v   prm bk21  b21v   prm bk31  b31v
 +   prm bk2  b2v prm bk12  b12v   prm bk22  b22v   prm bk32  b32v
 +   prm bk3  b3v prm bk13  b13v   prm bk23  b23v   prm bk33  b33v
 +   prm bk4  b4v prm bk14  b14v   prm bk24  b24v   prm bk34  b34v
 +   prm bk5  b5v prm bk15  b15v   prm bk25  b25v   prm bk35  b35v
 +   prm bk6  b6v prm bk16  b16v   prm bk26  b26v   prm bk36  b36v
 + prm bk7  b7v prm bk17  b17v   prm bk27  b27v
 +   prm bk8  b8v prm bk18  b18v   prm bk28  b28v
 +   prm bk9  b9v prm bk19  b19v   prm bk29  b29v
 +
 +fit_obj =
 + IF (X < Xval12) THEN
 + IF (X < Xval6) THEN
 + IF (X < Xval3) THEN
 + IF (X < Xval1) THEN
 + ((bk1-bk0)/​pStep)*(X-Xval0)+bk0
 + ELSE IF (X < Xval2) THEN
 + ((bk2-bk1)/​pStep)*(X-Xval1)+bk1
 + ELSE
 + ((bk3-bk2)/​pStep)*(X-Xval2)+bk2
 + ENDIF
 + ENDIF
 + ELSE
 + IF (X < Xval4) THEN
 + ((bk4-bk3)/​pStep)*(X-Xval3)+bk3
 + ELSE IF (X < Xval5) THEN
 + ((bk5-bk4)/​pStep)*(X-Xval4)+bk4
 + ELSE
 + ((bk6-bk5)/​pStep)*(X-Xval5)+bk5
 + ENDIF
 + ENDIF
 + ENDIF
 + ELSE
 + IF (X < Xval9) THEN
 + IF (X < Xval7) THEN
 + ((bk7-bk6)/​pStep)*(X-Xval6)+bk6
 + ELSE IF (X < Xval8) THEN
 + ((bk8-bk7)/​pStep)*(X-Xval7)+bk7
 + ELSE
 + ((bk9-bk8)/​pStep)*(X-Xval8)+bk8
 + ENDIF
 + ENDIF
 + ELSE
 + IF (X < Xval10) THEN
 + ((bk10-bk9)/​pStep)*(X-Xval9)+bk9
 + ELSE IF (X < Xval11) THEN
 + ((bk11-bk10)/​pStep)*(X-Xval10)+bk10
 + ELSE
 + ((bk12-bk11)/​pStep)*(X-Xval11)+bk11
 + ENDIF
 + ENDIF
 + ENDIF
 + ENDIF
 + ELSE IF (X < Xval24) THEN
 + IF (X < Xval18) THEN
 + IF (X < Xval15) THEN
 + IF (X < Xval13) THEN
 + ((bk13-bk12)/​pStep)*(X-Xval12)+bk12
 + ELSE IF (X < Xval14) THEN
 + ((bk14-bk13)/​pStep)*(X-Xval13)+bk13
 + ELSE
 + ((bk15-bk14)/​pStep)*(X-Xval14)+bk14
 + ENDIF
 + ENDIF
 + ELSE
 + IF (X < Xval16) THEN
 + ((bk16-bk15)/​pStep)*(X-Xval15)+bk15
 + ELSE IF (X < Xval17) THEN
 + ((bk17-bk16)/​pStep)*(X-Xval16)+bk16
 + ELSE
 + ((bk18-bk17)/​pStep)*(X-Xval17)+bk17
 + ENDIF
 + ENDIF
 + ENDIF
 + ELSE
 + IF (X < Xval21) THEN
 + IF (X < Xval19) THEN
 + ((bk19-bk18)/​pStep)*(X-Xval18)+bk18
 + ELSE IF (X < Xval20) THEN
 + ((bk20-bk19)/​pStep)*(X-Xval19)+bk19
 + ELSE
 + ((bk21-bk20)/​pStep)*(X-Xval20)+bk20
 + ENDIF
 + ENDIF
 + ELSE
 + IF (X < Xval22) THEN
 + ((bk22-bk21)/​pStep)*(X-Xval21)+bk21
 + ELSE IF (X < Xval23) THEN
 + ((bk23-bk22)/​pStep)*(X-Xval22)+bk22
 + ELSE
 + ((bk24-bk23)/​pStep)*(X-Xval23)+bk23
 + ENDIF
 + ENDIF
 + ENDIF
 + ENDIF
 + ELSE 
 + IF (X < Xval30) THEN
 + IF (X < Xval27) THEN
 + IF (X < Xval25) THEN
 + ((bk25-bk24)/​pStep)*(X-Xval24)+bk24
 + ELSE IF (X < Xval26) THEN
 + ((bk26-bk25)/​pStep)*(X-Xval25)+bk25
 + ELSE
 + ((bk27-bk26)/​pStep)*(X-Xval26)+bk26
 + ENDIF
 + ENDIF
 + ELSE
 + IF (X < Xval28) THEN
 + ((bk28-bk27)/​pStep)*(X-Xval27)+bk27
 + ELSE IF (X < Xval29) THEN
 + ((bk29-bk28)/​pStep)*(X-Xval28)+bk28
 + ELSE
 + ((bk30-bk29)/​pStep)*(X-Xval29)+bk29
 + ENDIF
 + ENDIF
 + ENDIF
 + ELSE
 + IF (X < Xval33) THEN
 + IF (X < Xval31) THEN
 + ((bk31-bk30)/​pStep)*(X-Xval30)+bk30
 + ELSE IF (X < Xval32) THEN
 + ((bk32-bk31)/​pStep)*(X-Xval31)+bk31
 + ELSE
 + ((bk33-bk32)/​pStep)*(X-Xval32)+bk32
 + ENDIF
 + ENDIF
 + ELSE
 + IF (X < Xval34) THEN
 + ((bk34-bk33)/​pStep)*(X-Xval33)+bk33
 + ELSE IF (X < Xval35) THEN
 + ((bk35-bk34)/​pStep)*(X-Xval34)+bk34
 + ELSE
 + ((bk36-bk35)/​pStep)*(X-Xval35)+bk35
 + ENDIF
 + ENDIF
 + ENDIF
 + ENDIF
 + ENDIF
 + ENDIF
 +;
 +}</​code>​

Personal Tools