How to fix Errors with lists Length? - algorithm
Help me please!
On the 3-rd step I got such errors as
Part 41 of ...... does not exist.
though on the previous steps it worked and returned results.
I've got lists of 40 elements in spkn,spkw,spmn,spmw and 41 in spx,spfn,spfw.
Code:
spx = {-2, -1.90577, -1.81153, -1.59327, -1.375, -1.35785, -1.3407, -1.24655, -1.22941, -1.11811, -0.934054, -0.80167, -0.75, -0.625,-0.5, -0.25, -0.0981238, 0.303752, 0.651876, 0.94833, 1, 1.5, 1.75,2.11731, 2.5, 2.5625, 2.625, 3.3125, 3.75, 4, 4.00964, 4.01928,4.25964, 4.36731, 4.5, 4.75, 5, 5.25, 5.5, 5.75, 6}
spkw = {105.056, 89.2249, 17.7361, 7.25929, 7.25929, 7.25929, 7.25929,1.09386, 1.09386, -7.35382, -12.5073, -11.929, -11.929, -15.429, -8.63312,-6.34314, -14.3807, -16.7907, -18.933, -12.3896, -3.021, -22.0262,-25.7865, -18.8033, -9.07591, -9.18036, -8.49959, -9.24378, -7.32337,-0.271835, -0.270096, 0.123206, 0.156523, 0.465142, 4.12922, 4.23318,8.03654, 8.20981, 12.1518, 12.3944}
spkn = {73.5426, 66.8007, 24.6942, 16.4029, 0.726929,0.314512, -1.23002, -1.23002, -3.90668, -10.8276, -14.2065,-13.0895, -18.656, -20.1709, -8.79676, -8.79676, -11.2319, -13.9771, -15.1407, -2.50312, -4.72374, -32.4496, -34.2958, -21.0455, -2.45882,-2.45882, -2.45882, -2.45882, -2.45882, -2.45882, -2.45882, -1.70357, -1.70357, -1.11799, 6.1251, 6.36752, 6.36752, 6.60995, 14.0955,14.5803}
spmw = {243.475, 213.305, 83.8004, 67.1081, 67.1081, 67.1081, 67.1081,59.4226, 59.4226, 49.9772, 45.1635, 45.6272, 45.6272, 43.4397,46.8376, 47.4101, 46.6214, 47.3535, 48.75, 42.5447, 33.1761,61.6839, 68.2644, 53.4787, 29.1603, 29.4279, 27.6409,30.1061,22.9045,-5.30161,-5.30859,-6.88938,-7.0313,-8.37913,-24.8675,-25.3613, -44.3781, -45.2877, -66.9686, -68.3634}
spmn = {180.448, 167.6, 91.3225, 78.1123, 56.5579, 55.9978, 53.9271,53.9271, 50.6364, 42.898, 39.742, 40.6374, 36.4626, 35.5158,41.2028, 41.2028, 40.9639, 41.7978, 42.5563, 30.5716, 32.7923,74.3811, 77.6119, 49.5569, 3.09017, 3.09017, 3.09017, 3.09017,3.09017, 3.09017, 3.09017, 0.0546329, 0.0546329, -2.5028,-35.0967, -36.2482, -36.2482, -37.5209,-78.6912, -81.4791}
spfn[[i]] = spkn[[i]]*spx[[i]] + spmn[[i]];
spfw[[i]] = spkw[[i]]*spx[[i]] + spmw[[i]];
spfw = {33.3632, 43.263, 51.6709, 55.5421, 57.1266, 57.2511, 57.3756,58.059, 58.0778, 58.1995, 56.846, 55.1903, 54.5739, 53.0828,51.1542, 48.9959, 48.0325, 42.2533, 36.408,30.7952,30.1551,28.6446,23.138,19.4168,6.47053,5.90328,5.32951, -0.513959, -0.750527, -6.38895, -6.39157, -6.39418,-6.36456, -6.09357, -6.28599, -5.25369, -4.19539, -2.18625, -0.133803,2.90414, 6.171}
spfn = {33.3632, 40.2933, 46.5882, 51.9781, 55.5583, 55.5708, 55.5762,55.4604, 55.4393, 55.0045, 530116,51.1309,50.4546,48.1226,45.6012,43.402,42.066,37.5522, 32.6864, 28.1979, 28.0685,25.7067, 17.5943,13.5547, -2.97428, -3.21054,-3.36422, -5.05466, -5.1301, -6.4392,-6.76879, -6.48231, -7.20196, -7.00719, -7.53373, -6.00246, -4.41058,-2.8187, -1.16621, 2.35765, 6.04694}
1-st step:
For[i = 1, i < Length#spfn, i++,
If[spfn[[i]]*spfn[[i + 1]] < 0 && spfw[[i]]*spfw[[i + 1]] < 0,
Print["1) exist roots: ", xnz[i] = -spmn[[i]]/spkn[[i]], ", ",
xwz[i] = -spmw[[i]]/spkw[[i]]] ;
Break[]
]
]
2-nd step:
For[i = 1, i < Length#spfn, i++,
If[(0 < spfn[[i]]) && (spfn[[i + 1]] < 0) && (0 < spfw[[i]]) && (0 <
spfw[[i + 1]]),
Print["2) exist roots:", xnz[i] = -spmn[[i]]/spkn[[i]], ", ",
spx[[i + 1]]] ;
Break[]
]
]
3-rd step(DOESN'T WORK):
For[i = 1, i < Length#spfn, i++,
If[(spfn[[i]] < 0) && (0 < spfn[[i + 1]]) && (0 < spfw[[i]]) && (0 <
spfw[[i + 1]]),
Print["3) exist roots:", xnz[i] = -spmn[[i]]/spkn[[i]], ", ",
spx[[i]]];
Break[]
]
]
THE RESULTS are:
1) exist roots: 5.58272, 5.511
2) exist roots:2.35475, 2.5
and errors:
Part::partw: Part 41 of {73.5426,66.8007,24.6942,16.4029,0.726929,0.314512,-1.23002,-1.23002,-3.90668,-10.8276,-14.2065,-13.0895,-18.656,-20.1709,-8.79676,-8.79676,<<8>>,-2.45882,-2.45882,-2.45882,-2.45882,-2.45882,-2.45882,-2.45882,-1.70357,-1.70357,-1.11799,6.1251,6.36752,6.36752,6.60995,14.0955,14.5803} does not exist. >>
Part::partw: Part 41 of {-2,-1.90577,-1.81153,-1.59327,-1.375,-1.35785,-1.3407,-1.24655,-1.22941,-1.11811,-0.934054,-0.80167,-0.75,-0.625,-0.5,-0.25,-0.0981238,0.303752,0.651876,0.94833,1,1.5,1.75,2.11731,2.5,2.5625,2.625,3.3125,3.75,4,4.00964,4.01928,4.25964,4.36731,4.5,4.75,5,5.25,5.5,5.75,6} does not exist. >>
and some more similar..
If you take the following out of your 'Code' section the rest executes without error messages.
spfn[[i]] = spkn[[i]]*spx[[i]] + spmn[[i]];
spfw[[i]] = spkw[[i]]*spx[[i]] + spmw[[i]];
Related
How can I optimise my code using "For-Loop"?
I am trying to develop a code which calculates Local Density of states of electrons in a material. For which I am using a multiple for loops and multiple tables. it takes 45sec to complete, I need less time for that. any suggestions how to optimize this code. AbsoluteTiming[Ns=2; \[Eta] = 0.001; Nx=15; Ny=15; NN=Nx*Ny; Nband=8; kkmx = Ns*Nx; kkmy = Ns*Ny; wmax = 0.2; nw = 800; p = 0; Print["starting ldos calc"]; nsite = 2; ldos = 0; For[kx = 0, kx <= (Ns - 1.)*2*(Pi/kkmx), kx += 2*(Pi/kkmx), For[ky = 0, ky <= (Ns - 1.)*2*(Pi/kkmy), ky += 2*(Pi/kkmy), ES = Eigensystem[H]; elist = Table[ES[[1,l]], {l, 1, Nband/2*4*NN}]; ulist = Table[Abs[ES[[2,l,i]]]^2, {l, 1, Nband/2*4*NN}, {i, 388+1, 388+(nsite - 1)*Nband/2 + Nband/2}]; vlist = Table[Abs[ES[[2,l,i + Nband/2*NN*2]]]^2, {l, 1, Nband/2*4*NN}, {i, 388+1, 388+(nsite - 1)*Nband/2 + Nband/2}]; ldossc = Table[Im[Total[Table[ulist[[l,1 ;; All]]*(1/(-wmax + wmax*2*(w/nw) - elist[[l]] + I*\[Eta])) + vlist[[l,1 ;; All]]*(1/(-wmax + 2*wmax*(w/nw) + elist[[l]] + I*\[Eta])), {l, 1, Nband/2*4*NN}]]], {w, 0, nw}]; ldos = ldos + ldossc; Export["ldosorb_up_P.dat", Table[{-wmax + wmax*2*(\[Omega]/nw), (-Pi^(-1))*(ldos[[\[Omega] + 1,i]]/Ns^2)}, {\[Omega], 0, nw}, {i, 1,8}]]; (* Export["ldostot.dat", Table[{-wmax + wmax*2*(\[Omega]/nw), (-Pi^(-1))*((ldos[[\[Omega] + 1,i]] + ldos[[\[Omega] + 1,i + 1]] + ldos[[\[Omega] + 1,i + 2]] + ldos[[\[Omega] + 1,i + 3]] + ldos[[\[Omega] + 1,i + 4]])/Ns^2)}, {\[Omega], 0, nw}, {i, 1, (nsite - 1)*Nband/2 + Nband/2 - 4}]]; *) Print["kx=", kx, " ky=", ky, " nsx=", (kx/(2*Pi))*kkmx + 1.]; ]; ]; ]```
Mathematica integration does not return value
If I integrate the following, I get answer: Integrate[(nor*x^ap*(1 - x)^bp*(1 - cp*x)*Exp[-t*al]), {x, 0.001, 1}, Assumptions -> {-1 < nor < 1, 0 < ap < 3, 0 < bp < 5, 0 < cp < 5, 0 < t < 2, 0 < al < 1}] and the answer is E^(-al t) nor ((1. Gamma[1 + ap] Gamma[1 + bp])/Gamma[2 + ap + bp] - ( 1. cp Gamma[2 + ap] Gamma[1 + bp])/Gamma[3 + ap + bp] + 0.001^ap (-((0.001 Hypergeometric2F1[1 + ap, -bp, 2 + ap, 0.001])/( 1. + ap)) + ( 1.*10^-6 cp Hypergeometric2F1[2 + ap, -bp, 3 + ap, 0.001])/( 2. + ap))) But if I want to do this, Integrate[(nor*x^ap*(1 - x)^bp*(1 - cp*x)*Exp[-t*al*(1 - x)]), {x, 0.001, 1}, Assumptions -> {-1 < nor < 1, 0 < ap < 3, 0 < bp < 5, 0 < cp < 5, 0 < t < 2, 0.5 < al < 1}] it doesn't give an final expression. It gives: Integrate[(nor*x^ap*(1 - x)^bp*(1 - cp*x)*Exp[-t*al*(1 - x)]), {x, 0.001, 1}, Assumptions -> {-1 < nor < 1, 0 < ap < 3, 0 < bp < 5, 0 < cp < 5, 0 < t < 2, 0.5 < al < 1}] which is the same as the integral. Could you please help me figuring out how to get answer for the second integral with additional (1-x) in the exponential?
Octave algorithm loop iteration
Can someone please tell me why this Octave algorithm does not execute the last iteration where i = 4 and j = 2? It seems to be affected by the break condition in the inner for-loop but this should not affect the last iteration. x = [2, 3, 4]; h = [1, 2]; y = [0, 0, 0, 0]; for i = 1:4 for j = 1:2 printf("i = %d, j = %d\n", i, j); if((i-j < 0) || (i-j > 2)) break; endif y(i) = y(i) + h(j) * x(i-j+1); endfor endfor I've tested it on my Debian system and it stops at i = 4 and j = 1. The output is: i = 1, j = 1 i = 1, j = 2 i = 2, j = 1 i = 2, j = 2 i = 3, j = 1 i = 3, j = 2 i = 4, j = 1
What you probably want is: for i = 1:4 for j = 1:2 if ((0 <= i-j) && (i-j <= 2)) printf("i = %d, j = %d\n", i, j); y(i) = y(i) + h(j) * x(i-j+1); endif endfor endfor or for i = 1:4 for j = 1:2 if ((i-j < 0) || (i-j > 2)) continue; endif y(i) = y(i) + h(j) * x(i-j+1); printf("i = %d, j = %d\n", i, j); endfor endfor In your code, when i==4 and j==1 the statement if((i-j < 0) || (i-j > 2)) break; endif will jumps out of the innermost for loop. The outermost for loop is already completed (i==4) and the programs ends. References: continue statement break statement
If you call "break", this is equally to jumping after the "endfor". So for i=4, j=1 (i-j) gets 3, you call "break" and i=4, j=2 never runs. See "continue" because I think this is what you want.
I ran your script in javascript. Here I have outputted the results of your condition. Seems like the scripts you have written performs as intended. x = [2, 3, 4]; h = [1, 2]; y = [0, 0, 0, 0]; for(i=1; i<5;i++) { for(j=1;j<3;j++) { console.log('i'+i+" j"+j); console.log('i -j > 2 '+(i -j > 2)); console.log('i-j < 0 '+(i-j < 0)); if((i-j < 0) || (i -j > 2)) { break;} y[i] = y[i] + h[j] * x[i-j+1]; } } execute it in your chrome console to validate your the cases.
parametric fractal dimension code in mathematica
I am beginner in Mathematica. I write code in mathematica for finding parametric fractal dimension. But it doesn't work. Can someone explain me where I am wrong. My code is: delta[0] = 0.001 lambda[0] = 0 div = 0.0009 a = 2 b = 2 terms = 100 fx[0] = NSum[1/n^b, {n, 1, terms}] fy[0] = 0 For[i = 1, i < 11, i++, delta[i] = delta[i - 1] + div; j = 0 While[lambda[j] <= Pi, j = j + 1; lambda[j] = lambda[j - 1] + delta[i]; fx[j] = NSum[Cos[n^a*lambda[j]]/n^b, {n, 1, terms}]; fy[j] = NSum[Sin[n^a*lambda[j]]/n^b, {n, 1, terms}]; deltaL[j] = Sqrt[[fx[j] - fx[j - 1]]^2 + [fy[j] - fy[j - 1]]^2]; ] Ldelta[i] = Sum[deltaL[j], {j, 1, 10}]; ] data = Table[{Log[delta[i]], Log[Ldelta[i]]}, {i, 1, 10}] line = Fit[data, {1, x}, x] ListPlot[data]
Null values in matrix, why?
I'm learning about dynamic programming via the 0-1 knapsack problem. I'm getting some weird Nulls out from the function part1. Like 3Null, 5Null etc. Why is this? The code is an implementation of: http://www.youtube.com/watch?v=EH6h7WA7sDw I use a matrix to store all the values and keeps, dont know how efficient this is since it is a list of lists(indexing O(1)?). This is my code: (* 0-1 Knapsack problem item = {value, weight} Constraint is maxweight. Objective is to max value. Input on the form: Matrix[{value,weight}, {value,weight}, ... ] *) lookup[x_, y_, m_] := m[[x, y]]; part1[items_, maxweight_] := { nbrofitems = Dimensions[items][[1]]; keep = values = Table[0, {j, 0, nbrofitems}, {i, 1, maxweight}]; For[j = 2, j <= nbrofitems + 1, j++, itemweight = items[[j - 1, 2]]; itemvalue = items[[j - 1, 1]]; For[i = 1, i <= maxweight, i++, { x = lookup[j - 1, i, values]; diff = i - itemweight; If[diff > 0, y = lookup[j - 1, diff, values], y = 0]; If[itemweight <= i , {If[x < itemvalue + y, {values[[j, i]] = itemvalue + y; keep[[j, i]] = 1;}, {values[[j, i]] = x; keep[[j, i]] = 0;}] }, y(*y eller x?*)] } ] ] {values, keep} } solvek[keep_, items_, maxweight_] := { (*w=remaining weight in knapsack*) (*i=current item*) w = maxweight; knapsack = {}; nbrofitems = Dimensions[items][[1]]; For[i = nbrofitems, i > 0, i--, If[keep[[i, w]] == 1, {Append[knapsack, i]; w -= items[[i, 2]]; i -= 1;}, i - 1]]; knapsack } Clear[keep, v, a, b, c] maxweight = 5; nbrofitems = 3; a = {5, 3}; b = {3, 2}; c = {4, 1}; items = {a, b, c}; MatrixForm[items] Print["Results:"] results = part1[items, 5]; keep = results[[1]]; Print["keep:"]; Print[keep]; Print["------"]; results2 = solvek[keep, items, 5]; MatrixForm[results2] (*MatrixForm[results[[1]]] MatrixForm[results[[2]]]*) {{{0,0,0,0,0},{0,0,5 Null,5 Null,5 Null},{0,3 Null,5 Null,5 Null,8 Null},{4 Null,4 Null,7 Null,9 Null,9 Null}},{{0,0,0,0,0},{0,0,Null,Null,Null},{0,Null,0,0,Null},{Null,Null,Null,Null,Null}}}
While your code gives errors here, the Null problem occurs because For[] returns Null. So add a ; at the end of the outermost For statement in part1 (ie, just before {values,keep}. As I said though, the code snippet gives errors when I run it. In case my answer isn't clear, here is how the problem occurs: ( Do[i, {i, 1, 10}] 3 ) (*3 Null*) while ( Do[i, {i, 1, 10}]; 3 ) (*3*)
The Null error has been reported by acl. There are more errors though. Your keep matrix actually contains two matrices. You need to call solvek with the second one: solvek[keep[[2]], items, 5] Various errors in solvek: i -= 1 and i - 1 are more than superfluous (the latter one is a coding error anyway). The i-- in the beginning of the For is sufficient. As it is now you're decreasing i twice per iteration. Append must be AppendTo keep[[i, w]] == 1 must be keep[[i + 1, w]] == 1 as the keep matrix has one more row than there are items. Not wrong but superfluous: nbrofitems = Dimensions[items][[1]]; nbrofitems is already globally defined The code of your second part could look like: solvek[keep_, items_, maxweight_] := Module[{w = maxweight, knapsack = {}, nbrofitems = Dimensions[items][[1]]}, For[i = nbrofitems, i > 0, i--, If[keep[[i + 1, w]] == 1, AppendTo[knapsack, i]; w -= items[[i, 2]]] ]; knapsack ]