Message Boards Message Boards

10
|
15051 Views
|
302 Replies
|
227 Total Likes
View groups...
Share
Share this post:
GROUPS:

[WSG24] Daily Study Group: Programming Proficiency

Posted 5 months ago

A Wolfram U Daily Study Group previewing our upcoming Programming Proficiency course sequence begins on Monday, January 29, 2024. The study group will run for ten days through February 9, and each day will run from 11AM to noon CDT.

Join me, @Abrita Chakravarty and a cohort of fellow enthusiasts to build a strong foundation for any and all sorts of Wolfram Language programming that you'll do in the future. We'll cover everything from syntax, definitions, and the underlying structure of expressions to efficient coding, working with various data structures, and even developing packages.

This study group will cover material from our Programming Fundamentals and Practical Programming courses, as well as provide attendees a first look at Programming and Development, the upcoming third and final course in the Programming Proficiency course sequence. Our intent is to provide a setting for this material which not only reaps the benefits of our Daily Study Groups'... well, group nature, but also spreads this material out over two weeks for those who cannot commit to the three-hour blocks required by these courses in their natural habitat.

This study groups aims to get you up and running with Wolfram Language, and as such no prior Wolfram Language or programming experience is necessary.

REGISTER HERE.

We look forward to seeing you there!

enter image description here

POSTED BY: Arben Kalziqi
302 Replies

Delicious!!! Once again a pedagogical Rosetta Stone. Thank you , Carl

POSTED BY: Carl Hahn

Let's see:

PLEASE SEE THE NOTEBOOK ATTACHED TO THIS COMMENT

EDIT: Really better just to use Coefficient. I don't like CoefficientList anymore; it's dead to me. So this is probably the most efficiently and extensibly you could write it?

Cases[yexp, 
 c___*Cos[arg_] /; 
  Abs@Total@Coefficient[arg, {ω1, ω2}] == 1]
Attachments:
POSTED BY: Arben Kalziqi

Thanks Arben, I will get back to you on that FM question. I have to find my notes on when I last tried to do it.

"If I'm reading your (original) post correctly, you could also do pattern-matching or selection by going directly into the cosine terms, extracting the coefficients of the omegas with CoefficientList and grabbing only those cosine terms for which the absolute value of the difference is 1"

That sounds kinda like what I was originally trying to do but unsuccessfully. Could you show an example?

POSTED BY: Carl Hahn

Hey Michael! The reason this happens is the order of evaluation. I have two suggestions for you to try which I think will clarify this behavior:

  1. Trace[TreeForm[Plus[1,2]]]

  2. TreeForm[List[a,b]] (=== TreeForm[{a,b}])

Let me know if this illuminates the difference for you.

POSTED BY: Arben Kalziqi

Arben,

First thank you for teaching this class. This has been very helpful.

I am running into some unexpected behavior. I just downloaded Version 14, and when I do TreeForm of a list I get:

enter image description here

but when I do the same thing using Plus, I get:

enter image description here

I was expecting to get the same thing but with List replaced with Plus. I am a bit puzzled.

Many thanks for your help. Michael O'Connor

POSTED BY: Michael O'Connor

I really strive to provide pedagogically useful answers, so I appreciate it :). If I'm reading your (original) post correctly, you could also do pattern-matching or selection by going directly into the cosine terms, extracting the coefficients of the omegas with CoefficientList and grabbing only those cosine terms for which the absolute value of the difference is 1. This would make it so you don't even have to generate the desiredHarmonics list, if that's indeed what you want.

As for your new question, some more information would indeed be helpful. It's been a long time since I've dealt with this sort of thing, and certainly I've never approached it from the perspective of signal analysis and decomposition. But, fundamentally, you could write the same kind of thing as above with Cases, specifically recalling that Cases allows not just for pattern-matching but for term-rewriting too. So you could do something like:

Cases[expr,Cos[B___ Sin[ω t]]:>(full or truncated B-dependent sum here)]

This would extract all of the relevant cosine terms and rewrite them; you could update the rule to include both sine and cosine terms but I'm forgetting the way to do that right now. You could do something similar to the previous case and just extract all cosine or sine terms that have the right form, then use a simple /. to write a rule which appropriately converts the cosines and sines to their sum forms. You may also be interested in TruncateSum (new in 14), though this behavior was always manually implementable with a little elbow grease.

Otherwise, if you have an exact worked example, I'm pretty sure I could write something up reasonably quickly.

POSTED BY: Arben Kalziqi

Thank you, Arben!!!

That's a really neat approach. Had not yet thought along the path of creating a list of all the terms. But entirely consistent with thinking about the heads and changing them. That's a powerful analytical tool.

Your solution has a lot of pedagogical value. I am going to be staring at it a bit.

If you are on a roll, I've got another one coming as soon as I can figure out how to ask it properly. Let me take a crack and if it needs more let me know: It has to do with a problem in FM theory, where recognizing that Cos (B Sin [w t]) can be expanded as a Fourier series whose coefficients are an ordinary Bessel Function of the first kind

= Jo(B) + 2 Sum (J2n(B) Cos (2 n w t) )

Then you have to truncate the series to get the coefficients of interest. There is a similar expansion for Sin(B Sin (w t). You can sample an FM signal and do an FFT and just see the spectrum, but recognizing the Bessel Function behavior provides an intuitive understanding of FM theory (bandwidth, mod index, S/N properties etc) that even when FM was really popular few people grasped. Now it's beginning to be a lost art. What I never figured out how to do was use WL pattern matching and mapping tools to "recognize" and derive this classical solution. It has other analytical advantages for other problems too.

POSTED BY: Carl Hahn

We really do abhor a brute force solution. This is a fun little question; please see embedded response!

PLEASE SEE THE NOTEBOOK ATTACHED TO THIS COMMENT

Attachments:
POSTED BY: Arben Kalziqi

Hey Steven—I think that these three points in concert are enough to answer your question, but please let me know if they don't:

  • Map[f,expr,n] maps f to expr down to level n
  • Map[f,expr,{n}] maps f to expr only at level n
  • Map[f,x] = x for AtomQ[x]==True (cf. our discussion yesterday: Map goes into the inside of an expression to work on its parts; atoms don't have parts so Map has nowhere to put the f—this could have been designed to produce an error message, but the decision was to have Map function such that if it can't map a function f somewhere, it just returns the object onto which f was asked to be mapped)
POSTED BY: Arben Kalziqi

As do I. Coe, you might have given larger an incorrect definition that hasn't been overwritten for one reason or another—try restarting your kernel and running these two lines again? (Re: the new comment—the semicolon is fine. It's not necessary for SetDelayed definitions since the evaluation is, as claimed, delayed!)

POSTED BY: Arben Kalziqi
Posted 5 months ago

Try removing the semicolon

POSTED BY: Steven Brawer
Posted 5 months ago

I get 6 on my notebook.

POSTED BY: Steven Brawer
Posted 5 months ago

From yesterday's lesson, does anyone understand why

    larger[x_, y_] := If[x > y, x, y];
    Fold[larger, {3, 1, 2, 6, 5}]

returns larger[larger[larger[larger[3, 1], 2], 6], 5] and not 6?

POSTED BY: Coe Miles

Hello Phil,

Thank you for letting me know. I apologize for the confusion created.

Upon a detailed look, the behavior described seems to be related to the fact that Wolfram Cloud and Wolfram Desktop are two separate products. The basic plan for Cloud grants users the basic functionalities needed for a smooth Desktop operation, but it does not grant access to the Wolfram Cloud as a product in and of itself. Basic Plan restrictions

This is why the direct dynamic interaction within Wolfram Cloud is not available but the use of CloudPublish from Desktop, either programmatically or through the menu tool, works as expected.

I will try to improve my Q&A support with your feedback. I have already setup a basic account for testing of future questions. Thank you!

POSTED BY: Oliver Jandette
Posted 5 months ago

map mystery

Can someone explain what is going on in the expressions below the tree, or would this be too advanced for the level of this course (which, if it is, is OK with me)?

(See attached png file)

Attachment

Attachments:
POSTED BY: Steven Brawer

Hey Arben,

Loving your class. Got a little exercise:

The transfer function of non linear power amplifiers produces inter-modulation products between the tones at their inputs. If the transfer function is expressed as a simple 5th order odd polynomial, and the input x is made of two sine waves at frequencies w1 and w2, you can easily find the mess that shows up at the output. It includes 3rd and 5th order inter-modulation products around the two tones, 3rd and 5th harmonics, and inter-modulation products around the harmonics. In RF systems we use band-pass filters to select only the fundamental tones and those tones around the fundamentals w1 and w2 (usually assumed to be closely spaced compared to the frequencies of the harmonics... Although audio systems will not be so cooperative.)

I've been playing around with some of the concepts I thought I was learning to take the output and literally select them, but it's not working yet. In the past I've just given up and brute forced it (yuk). This time round I'd like to learn how to do it right...help?

POSTED BY: Carl Hahn
Posted 5 months ago

Arben - Thank you very much for the detailed explanation. I am finding this material somewhat difficult but rich and rewarding when something sticks.

POSTED BY: Coe Miles
Posted 5 months ago

Thanks. That's really helpful.

POSTED BY: Steven Brawer

Hi Phil,

I think this can be better understood and handled through contacting customer support:
https://www.wolfram.com/support/contact/email

POSTED BY: Ahmed Elbanna

Hey Coe, I can explain this.

Total is documented to take the elements of a list and add them together. In other words:

Total[{a,b,c,...}] === Plus@@{a,b,c,...} === Plus[a,b,c,...]

In standard notation, that means that Total[{a,b,c,...}] just evaluates to a+b+c+.... Nothing too surprising here, I think.

The misunderstanding likely comes from two places.

Since Wolfram Language is fully symbolic by default, we never said what a, b, c and so on might be. They don't need to be reals or integers or even numbers—in fact, try this for me:

randomImages=Table[RandomImage[{0, 1}, {25, 25}], {2}]
Total@randomImages

If there is a sense in which the arguments inside the List fed to Total can be added, then Total will add them because it is very literally just performing the pattern-matching term-rewriting transformation rule I expressed above.

Now that we know what Total does, if we want to understand the output of Total[{{a, b, c}, {u, v, w}, {x, y, z}}], we need to ask: what does Plus do when fed multiple List objects?

You can try this out manually, but that's basically just rewriting the thing that we're not understanding in the first place. Instead, you might try Attributes[Plus]. You get back several attributes, but the important one here is Listable. If you check the documentation for that, you'll see examples which basically replicate the behavior that prompted this question:

In[1]:= {a, b, c} + {x, y, z}

Out[1]= {a + x, b + y, c + z}

This is to say: Listable functions automatically thread over their arguments when those arguments are lists. Most built-in mathematics functions are listable, and this attribute allows for highly optimized code compared to looping or even mapping.

In the case of Plus, this behavior also happens to correspond to the standard mathematical operation of addition acting on vectors, matrices, and tensors more generally. After all, if you have the vectors a, b, and c, you find their sum by element-wise addition, right? The same is true for matrices and so on. (And in fact, people are often lazy and will "add" a scalar to a vector when what they really mean is that they want to add a constant vector to a vector. For example, somebody might say x = <1,2,3>, then say something like x + 1, when really they mean x + <1,1,1>. This is also automatically handled by Listable; feel free to evaluate {a,b,c}+1 and see the result, or even {{a,b},{c,d}}+1.)

POSTED BY: Arben Kalziqi

I think I see what you mean; I think that that's fair enough if you're thinking about it in terms of TreeForm. The discrepancy, such as it is, exists because technically Part is always "reaching into" an expression (cf. the reason you can't [""] use Part on atoms is because they don't have an "inside" to reach into).

That is: whenever you say expr[[n]], you are going into expr and extracting something. If you have not just a single n, but exprp[[m,n,...]] then the number of elements in that sequence specifies the Depth at which you are accessing the structure of expr. The issue here is that expr[[0]] does indeed not work like this: because indexing in Wolfram Language starts at 1, this is not "getting a part" of expr in the same sense that expr[[n]] for n≥1 is, but is "special case", manually-implemented extra behavior.

I do see why one might consider this inconsistent, but my personal sense is that [[0]] is simply used as a convenient syntax shortcut for Head@. If we didn't have it, the behavior of Part would indeed be more consistent, but it would also be less functional for some particular uses... my perhaps-frustrating advice is to do a bit of compartmentalization about the meaning of Part, here. We're already doing that when using Part on SparseArray or Dataset atoms, so why not add one more case where Part is doing something which is maybe a little bit misleading...

Finally, I do want to clarify something: because this [[0]] is a special behavior which does not give you the 0th part in the technical sense (as there is no 0th part in a language which indexes from 1), it is not the case that there is an implicit 0 which starts off any Part sequence. Moreover, there's nothing in any given expr that you cannot access because of this: the entirety of the internal structure of expr (if it has any) is accessible without making any reference to any 0th part. It's just that if you would like to get not the internal structure, but the thing that wraps around that internal structure—which in the strict sense is not a part—then we allow you to do that with Part[expr,0] as a convenience.

The succinct version is maybe:

  • Part is really only intended to talk about the parts of a compound expression, and the "parts" of an expression are always internal to the expression.
  • Because you could already access everything about an expression but its head with Part, we added a special case of asking for """the zeroth part""" so that you could get that last bit of information without having to leave Part-world.
POSTED BY: Arben Kalziqi
Posted 5 months ago

Hey everyone, care to take a stab at explaining why:

Total[{{a, b, c}, {u, v, w}, {x, y, z}}]

returns

{a + u + x, b + v + y, c + w + z}  (*One of our Day 4 "Check Your Understanding" questions*)

I've looked at the documentation for "Total" and still can't figure out how this result is obtained. Thanks in advance,

POSTED BY: Coe Miles

Arben, Just to let you know I opened this notebook the next day in order to try your suggestions, and it had healed itself overnight. One of those situations you're glad it's fixed without any effort, but not quite sure why. Anyway, all is good for now, and everything is working again as expected. I even entered some new comments and code into the notebook, and nothing seemed to upset it again. Fingers crossed! :<) :<)

POSTED BY: Michael Ulrey
Posted 5 months ago

It seems to me the Head is just a node. I don't understand why it should be different from any other node. If it doesn't have a structure, why should any other node have a structure? I suppose there is something in the engine which interprets the head node differently from other nodes.

POSTED BY: Steven Brawer

I don't think that this is an inconsistency: if you do extract a head with [[0]], that head does not have some internal structure that you can probe by asking to get its parts. What is the second part of Graphics?

POSTED BY: Arben Kalziqi
Posted 5 months ago

Tree walking - inconsistency or design

Given some algebraic expression y, I can do y[[3,2,5,1,..]] to walk the tree (or the full form) to a particular node.I can also do y[[0]] which is the same as y//Head. However, y[[0,2]], for example, is an error in my notebook, though presumably it should be the same as y[[2]].

This seems to me an inconsistency, but perhaps it is that way on purpose???? (In y[[3,2,5,1,..]], presumably the "0" is implicit.)

This is probably not a big deal, but I am bothered by stuff like this - a sort-of reflection edge condition that doesn't seem sensible.

POSTED BY: Steven Brawer

Good catch! I've fixed this in our repo and it will be fixed in our next deployment.

POSTED BY: Arben Kalziqi

In the "Check Your Understanding" exercise for pure functions we are told that Function[u, 3+#][x] is the correct syntax for returning 3+x given x as an argument.

I think that's incorrect (?)

POSTED BY: Paul Tikotin
Posted 5 months ago

I asked in the BigMarker Q&A panel how to upload a WL Notebook to my Wolfram Cloud account. The reply was to use the "upload" button in the upper right corner of the Wolfram Cloud window. This doesn't work; I get the error message, "To access this feature, subscribe to a plan." Apparently, the Basic plan isn't good enough.

I can upload files through Mathematica on another machine through the File->Save to Cloud function. I don't understand why that works but simply doing an "upload" in cloud does not. Is there a good reason for keeping a random user from uploading any notebook to a Wolfram Cloud account through the web? If not, please file this as a bug.

One note for the staff answering questions: when they are answering a question like this, they should try to perform the function with the same level of privilege/access as a normal customer. In this case, the Wolfram Cloud "upload" function should have been tried on a Basic plan.

POSTED BY: Phil Earnhardt

Heh, it's true :). At least in this case it's been superseded by something simpler and clearer!

POSTED BY: Arben Kalziqi

I can heartily recommend this. While I am in no position to judge Wolfram's contribution to Physics, the ideas are fascinating and are something I would like to pursue.

If I am hearing him correctly, he is attempting to make sense of Physics by looking at it as a system that is computable by the application of rules for re-writing. He seems to be saying the system evolves what look like small black holes and "elementary" particles from vacuum energy. Of course he is talking to a professional physicist here so we hear him respond to some good questions.

I am stricken by the similarity of the method Wolfram is proposing and the spirit of the the approach we seem to be taking in grappling with Mathematica. Very stimulating!

https://www.youtube.com/live/ITJ3AF3TK5M?si=rECCBuBAAVWa_Im4

POSTED BY: Paul Tikotin

Although Show[Graphics3D[Stellate[ Icosahedron[ ]]]] wasn't forward compatible.

I'm with you there—I immediately thought that the following image, from this blog post, was very striking:

enter image description here

POSTED BY: Arben Kalziqi

One thing that really attracted me to Wolfram was how the expressions in a book I picked up published in 1988 still computed. Thankful, in this universe there is forward compatibility, even amongst changes in scientific knowledge.

The notion of uncuttable is really helpful, thank you. I’ve now learnt to turn to inbuilt functions in order to better understand what’s going on and just the idea of syntactic convenience is helpful in getting over what at times has felt like contradictions in terms. I remember Prof Richard J. Gaylord saying once that Wolfram, at times, behaves strange, and never quite knew what was meant by that (likely the pitfalls of intuition).

Posted 5 months ago

Perfect. I get it, thank you.

POSTED BY: Coe Miles

I think the best way to see what is going on, on your own machine, is to look at y//FullForm and z//FullForm. They are quite different.

enter image description here

However if you insert a space between a and x in your expression for z, then y and z should be the same.

[If you are somehow stripping out spaces, then that will cause you problems. Mathematica really uses the spaces as Arben says.

I am already finding that when I am getting odd results, using FullForm, TreeForm etc can make things clearer.

POSTED BY: Paul Tikotin

Yes, I also found that I couldn't use the code output by those boxes in situ. Entering it into a new code cell works fine.

POSTED BY: Arben Kalziqi

Yes, I also found that I couldn't use the code output by those boxes in situ. Entering it into a new code cell works fine.

POSTED BY: Paul Tikotin

Yes, the very same! It's from τόμος, which I think is from τέμνω, which is something like "to cut/slice/section/portion".

POSTED BY: Arben Kalziqi

I think the apparent confusion regarding the word atom is as a result of an error in the evolution of our scientific knowledge. It is only relatively recently that we discovered that 'atoms' of, say, radium are not really atoms in the logical sense of the word. Then we repeated the mistake, calling some of the sub-atomic bits "fundamental" only to find...

In a parallel universe where the Wolfram language was developed in 1880, the concepts of atoms in Mathematica and Chemistry would have been consistent. Although some physicists maintained that the atoms of the chemical elements were fictional conveniences for the sake of calculation and that, if they even existed they would be too small to ever be known. Then came 1905 and Einstein's analysis of Brownian motion.

POSTED BY: Paul Tikotin
Posted 5 months ago

Hi Everybody!

I would like to produce documents effectively (so programmatically) and I need to find help about producing cells, sometimes cells within cells (within cells?). Can anybody give a good reference? Such things as TextData, BoxData, ToBoxes, ToString and similar.

POSTED BY: Artur Piekosz

Nice! I hadn't thought (until today!) about the derivation of the word atom. So, 'tom' as in 'tomography'.

POSTED BY: Paul Tikotin

Arben, Thanks, that makes a lot of sense since both errors occurred at the same time. I'll try out your suggestions and see what happens.

POSTED BY: Michael Ulrey
Posted 5 months ago

ax is on variable not two variables a * x is and expression equal to a space x

POSTED BY: Gregory Sowder

I'd highly recommend Professor Richard J. Gaylord's Wolfram Language Fundamentals

Hi Lewis—I understand what you're saying abstractly, but am having trouble understanding how it applies into specific to the discussion of atoms today. Let me offer a few clarifying comments and we can go from there?

  • Atoms are the fundamental building blocks of compound expressions in Wolfram Language.
  • Any compound expression, when you get to "the bottom of it"—literally, in the sense of TreeForm—is made up of atoms.
  • "Atom", in the context of Wolfram Language, is meant in the original Greek sense: "a thing which cannot be cut". What we mean by "uncuttable" is that Part/[[ ]] does not fundamentally work on atoms; various functions can pull things out of atomic objects (cf. Numerator and Denominator for Rational atoms, ReIm for Complex atoms, EdgeList for Graph atoms, and so on).
  • However—and it's a big "however"—there are some cases where an atomic object might be expected to have its insides accessible via Part (e.g. Dataset, SparseArray, NumericArray...). To that end, the front end will automatically "translate" a user request for Part into the correct underlying code to give the "expected" result. This lets you access the parts of a SparseArray "with" Part, for example.
  • Ultimately, though, this is a syntactic convenience—just like, in a sense, being able to say a+b rather than Plus[a,b] or {a,b,c} rather than List[a,b,c]. There exists an underlying "truth" and Part is not part of that truth when it comes to atoms.
POSTED BY: Arben Kalziqi

Understanding this helps in navigating subjects that cross disciplinary boundaries. - GPT4

There are sub-atomic parts

Hi Michael—I think the issue comes from the formatting that this notebook has for that ListLinePlot input. Ideally, it would just be an input... but when you click into it, you can see that there's a kind of yellow box around it. Basically, this is a text cell formatted as input and so it won't evaluate correctly, if we're seeing the same thing. (I think your specific errors with respect to Dynamic elements here are kernel-specific and thus not "carried with" the notebook that you uploaded when I open it on my end, so I can't see for sure what your issue was.)

if you just start typing ListLinePlot in a new cell, you should be able to plot the data without issue. I think what's happening is that on our end, making the Hint/Solution buttons does something unfortunate to the formatting of code blocks that we had intended for you to type into. I'll look into this with our team.

POSTED BY: Arben Kalziqi

Please see the answers downthread—the easiest way I know to explain this is that if you say ax, how is Wolfram Language to know that you actually, truly, really meant a*x? It can't.

If you were to type myVar^2, you ostensibly would not expect to get m^2 * y^2 * V^2 * a^2 * r^2, so why expect differently for ax^2?

(Since tone is never conveyed well over text, I want to be clear that the intended tone here is "Socratic" rather than "snippy" ;).)

POSTED BY: Arben Kalziqi

pat3 is x_, which means "any one thing—call it x." Every element of exprs is just a single thing, so they all match. Because we're not using that x anywhere, this pattern is equivalent to just _, i.e. "any one thing".

We might see a named pattern like x_ in a standard function definition:

f[x_]:=x^3

The x on the LHS has nothing to do implicitly with the "any one thing" denoted by the _. The x is just a dummy name that we give to that one thing (the one thing that appears in f's brackets) so that we can refer to it on the RHS. Consider the example:

f[x_]:=5

There's no mention of x on the RHS, so it's pointless to even name it on the LHS (in some sense.) It would be exactly the same to instead say:

f[_]:=5

The point is that "f of any one thing" should be 5. We don't care about the input here, so why bother to name it if we're never going to use it? In this sense, we are saying that f is a transformation rule that takes anything of the form "f of any one input, and I don't care what that input is" and returns 5.

POSTED BY: Arben Kalziqi
Posted 5 months ago

Hate to redundant, I still can't get by this. If this is a real error, other errors I get may be me or Mathematica - can't tell. Btw, $Version returns: 14.0.0 for Mac OS X ARM (64-bit) (December 13, 2023).
enter image description here

POSTED BY: Coe Miles

pat2 is _h, which explicitly means: "any one thing with head h". This is not the same as h_, which means "any one thing—call it h". It is (except for perhaps some pathological edge cases) the same as h[_], which is "h of any one thing."

POSTED BY: Arben Kalziqi

Yeah, it's just atoms have parts as far as atoms are concerned, as apposed to atomic expressions. The same signifier ("atom") points to different signified concepts depending on the context, hence counterintuitive. Essentially, atomic parts are not the same in the case of the fundamental concept in chemistry and physics and atomic expressions and therefore not covered by Part in the normative sense. So an error message is returned.

...and this can be seen: AtomQ[exp[[1]]] returns true.

POSTED BY: Paul Tikotin

While working with the exercises for Day 3 (Syntax and Expressions), I got the following error message while attempting Exercise 4 (ListLinePlot for airline passenger data), namely "An improperly formatted option was encountered. The left-hand side of the option was not a symbol or string* My solution(s) worked fine initially, but then went wonky all of sudden. In fact every plot in the notebook threw the same error message, whether options were specified or not. (Also all of the dynamic Hints and Solutions boxes disappeared, but that's not my main concern right now). Please see attached notebook..

Attachments:
POSTED BY: Michael Ulrey
Posted 5 months ago
In[84]:= Clear[x, y, a, b, c]

In[85]:= y = a x^2 + b x + c

Out[85]= c + b x + a x^2

In[86]:= Expand[y^2]

Out[86]= c^2 + 2 b c x + b^2 x^2 + 2 a c x^2 + 2 a b x^3 + a^2 x^4

system: Apple M2 Ultra, 14.3 (23D56) Mathematica: 14.0.0.0 Mac OS X ARM (64-bit)

POSTED BY: Randy Janke

AtomQ[#] & /@ {exp[[1]], exp[[2]]} returns {True, False}, and Atoms don't have parts (errrrrrr... it's counterintuitive).

Another way of saying the same thing: Mathematica is taking ax^2 to mean (ax)^2. This can be seen by asking for the FullForm.

In terms of today's lesson: AtomQ[ax] returns True , AtomQ[a x] returns False.

POSTED BY: Paul Tikotin

Is anyone else experiencing problems with the question submission bar in bigmarker on Chrome? When I go to type, the text box turns white, with white text, rendering the text unreadable.

[redacted]

It can happen even after a decade of using the language—I was once thwarted for an entire day by an errant curly/("""smart""") quote breaking a string expression when I first start working here!

POSTED BY: Arben Kalziqi

When I'm using those terms, I mean:

  • Vector: something that you can describe with 1 index. It could have a length of 2 or a million, but you could get any singular element out of it by doing vec[[n]].
  • Matrix: something that needs two indices to get any individual elements from: say, the element at the first row and third column could be accessed with mat[[1,3]].
  • Tensor: generic term for anything where you'd need more indices to describe the position of a single element. Note that this is not really an appropriate definition in the physics sense, but I'm being a little loose with it. You can think of them as the general case of the special "one-index" and "two-index" cases of "vector" and "matrix", respectively.
  • Expression: any sort of singular "thing" in Wolfram Language—that is, anything that's not a sequence like a,b. a is an expression, Plot[x,{x,0,5}] is an expression, and so on.

You can see more of the fun of conflicting definitions here.

POSTED BY: Arben Kalziqi

In Wolfram Language, the structure of expressions and how they are indexed can sometimes be counterintuitive if you're not familiar with the underlying representation. Let's break down your example to understand it better.

Consider the expression exp = 1 + x^2. In Wolfram Language, this is internally represented as Plus[1, Power[x, 2]]. The head of this expression is Plus, and it has two arguments: 1 and Power[x, 2].

exp[[2, 1]] returns x because it's accessing the first part (x) of the second argument (Power[x, 2]) of exp. exp[[2, 2]] returns 2 because it's accessing the second part (2) of the second argument (Power[x, 2]) of exp. Now, regarding exp[[1, 1]], the confusion arises because 1 is an atomic expression in Wolfram Language (it does not have a head and arguments structure like Power[x, 2] does). Atomic expressions include things like numbers, symbols, and strings. When you try to access a part of an atomic expression, it results in an error or an unexpected result because atomic expressions are considered as having no parts.

So, exp[[1, 1]] is trying to access a part of the atomic expression 1, which doesn't have any parts, hence the issue. In Wolfram Language, the parts of atomic expressions are not accessible in the same way as the parts of composite expressions.

  • GPT 4

exp[[2, 2]] returns 2, the second part of the second part, I'd expect exp[[1, 1]] to return the first and only part of the first.

Posted 5 months ago

I know you touched on this, but in exp = 1 + x^2, exp[[2, 1]] returns x, yet exp[[1, 1]] is longer than the depth of the object, why again?

POSTED BY: Updating Name
Posted 5 months ago

Bang head with hand. I forgot. Thanks.

POSTED BY: Steven Brawer

To be absolutely clear: this is equivalent to asking why var^2 does not return v^2 a^2 r^2. If you don't type a space or an asterisk between two letters, there's no way for the system to know that you're talking about two separate symbols.

POSTED BY: Arben Kalziqi
Posted 5 months ago

When I enter everything without spaces I get the wrong answer. When I enter WITH explicit asterisks, I get the right solution. The attached image shows what is entered and the result.

Attachment

Attachments:
POSTED BY: Coe Miles
Posted 5 months ago

Steven - I get the correct answer when using explicit multiplication:

    y = a*x^2 + b*x + c

Why is this? Arben?

POSTED BY: Coe Miles

Hey Coe—I'm not sure what you mean. The attached notebook is missing the spaces between the coefficients and thus produces the incorrect output. You want:

y=a x^2+b x+c

or, explicitly:

y=a*x^2+b*x+c

in order to get the correct polynomial expansion.

@ Steve, you can type your code between two backticks to prevent it from formatting via markdown, which is why the asterisks are being used for formatting rather than displaying.

POSTED BY: Arben Kalziqi
Posted 5 months ago

I don't believe this is a space issue. The notebook shows input (w/o spaces) and the incorrect output.

POSTED BY: Coe Miles

Addendum to Lara's explanation: "ax" is read as one symbol, as opposed to "a x" which is read (in the example case) as two distinct symbols of a numeric type, so the space is interpreted by Mathematica as an implied multiplication.

POSTED BY: David Snyder
Posted 5 months ago

Steven/Arben - I too am getting the INCORRECT result. I am also running Mathematica 14.0.0 on Mac silicon. (This might also explain some of the results I have been getting!) I create a notebook and set y = ax^2 + bx + c. I then try Expand[y^2] and get the following:

    ax^4 + 2 ax^2 bx + bx^2 + 2 ax^2 c + 2 bx c + c^2

I have attached my notebook and an image making it clear what element is incorrect in Mathematica's answer.

Attachment

Attachments:
POSTED BY: Coe Miles
Posted 5 months ago

Write "a x" with a space between a and x. Mathematica interprets the space as a multiplication.

POSTED BY: lara wag
Posted 5 months ago

More info: When I do "y = ax^2 + bx + c", with explicit asterisk, then Expand[y^2] is correct c^2 + 2 b c x + b^2 x^2 + 2 a c x^2 + 2 a b x^3 + a^2 x^4

Note: The preview removes the explicit asterisks. What works is y = a asterisk x^2 + b asterisk x + c

POSTED BY: Steven Brawer

If you want to create a new question on Wolfram Community, please use the button "Start a new Discussion" on the right side of Community's homepage.

enter image description here

Then use the instructions here: http://wolfr.am/READ-1ST

POSTED BY: Ahmed Elbanna
Posted 5 months ago

PROBLEM PROBLEM PROBLEM

When I create a notebook and try y = ax^2 + bx + c, then

Expand[y^2] gives
ax^4 + 2 ax^2 bx + bx^2 + 2 ax^2 c + 2 bx c + c^2
in my notebook, which is incorrect,

while yours has
c^2 + 2 b c x + b^2 x^2 + 2 a c x^2 + 2 a b x^3 + a^2 x^4
which is correct.

I'm, using Mathematica 14.0.0 on Mac silicon. Here is my notebook

POSTED BY: Steven Brawer
Posted 5 months ago

Hi Arben,

Would please clarify the following terms: vector, array, matrix, expression? And regarding the docs, what's the difference between options and properties in a function?

POSTED BY: Updating Name
Posted 5 months ago

I thought I understood this material during the lecture; most things made sense. Some parts of Problem 1 however just don't seem right. For example, why does pat3 give the following result?

exprs = {1, h[], h[a], h[b], h[a, b], h[a, a], h[a, b, c], g[h[a, b]]}
pat3 = x_
Cases[ exprs, pat3]
    {1, h[], h[a], h[b], h[a, b], h[a, a], h[a, b, c], g[h[a, b]]}

I see no way to get this result.

Thanks in advance,

POSTED BY: Coe Miles
Posted 5 months ago

My apologies folks, I mis-wrote the equality that I am asking about. Again -

In today's post-lecture questions "pat2 = _h" Case tells me that pat2 matches the following elements in exprs:

    {h[], h[a], h[b], h[a, b], h[a, a], h[a, b, c]}

Does this mean that **pat2 = _h = h_**? It seems like it, but this seems odd to me in that we are PATTERN MATCHING and, it seems to me, elements in one order should not necessarily be equivalent to elements in a different order.

Comment?

POSTED BY: Coe Miles
Posted 5 months ago

In today's post-lecture questions "pat2 = _h" Case tells me that pat2 matches the following elements in exprs:

    {h[], h[a], h[b], h[a, b], h[a, a], h[a, b, c]}

Does this mean that pat2 = h = h? It seems like it, but this seems odd to me in that we are PATTERN MATCHING and, it seems to me, elements in one order should not necessarily be equivalent to elements in a different order.

Comment?

POSTED BY: Coe Miles
Posted 5 months ago

Arben, how do I post without replying to someone else's post (like I am doing now)?

I do have a question about Riffle[ ].

Riffle[{1,2,3}, {x, y}]

outputs {1,x,2,y,3}, understandably. But

Riffle[{x,y}, {1,2,3}]

outputs {x,1,y}. Why? I would have expected to get {x, 1, y, 2}.

Thanks.

POSTED BY: Wissam Barakat

Wonderful explanation! I'm going to give this more thought. I'm trying to get my head around Wolfram engine.

Yes! The evaluation system is effectively a huge database of pattern-matching term-rewriting rules. For example, think about:

D[x^3,x]

We know that this is "the derivative of x cubed with respect to x", and we know that when we see this pattern—the derivative of x^n_, if you will—that we should take the power, drop it to the front, and then subtract 1 from the power.

The Wolfram system is effectively doing the same thing: it sees that something matches the pattern D[x^n_,x] and says what we do: "I know what to do when I see that: D[x_n,x] :> n*x^(n-1) and that's what's returned to us.

When you write your own functions, you are effectively adding to this database of term-rewriting rules (and are often using those rules as foundations for your own definition). In this way, any program you write is just about matching patterns and transforming the appropriate ones into something new.

POSTED BY: Arben Kalziqi

question = "If Mathematica is a term rewriting system, when I write a programme in Mathematica, am I writing a term rewriting rule, and is the programme a function?";

If[question==={"yes", "yes"}, "At what point does a rule become a system?","Help!"]

Hello Coe!

Arben's explanation made me want to see it in color. This is what came of it. I hope it helps.

PLEASE SEE THE NOTEBOOK ATTACHED TO THIS COMMENT

Have fun!

Attachments:
POSTED BY: Lori Johnson

Hey Coe, could you be a little clearer in your description of your inputs, their actual outputs, and the outputs you would expect? In the meantime, let me explain the meaning of each line you've included here.

Alphabet[][[;;10;;4]]

This is equivalent to Alphabet[][[1;;10;;4]]. This means "starting with the list of all of the letters in the (Latin) alphabet, take the first through the tenth elements in steps of 4." I.e., that's elements 1,1+4,1+4,+4===1,5,9. (You don't go to 13 since the initial list only has 10 elements.) And indeed, that's what this code does—cf. MapIndexed[#2[[1]] -> #1 &, Alphabet[]] or Thread[Range@26 -> Alphabet[]] to see it directly.

Actually, I see what you were initially asking. I think the above sufficiently clarifies it, but "in order":

  • Alphabet[] provides a list containing the characters of the Latin alphabet
  • Appending [[;;10]] is the same as appending [[1;;10]] and is extracting the 1st through 10th parts of the list containing the alphabet
  • Similarly, appending [[;;4]] is equivalent to appending [[1;;4]] and is extracting the 1st through 4th parts of the list containing the alphabet

Doing [[a;;b;;c]] is not the same as doing [[a;;b]][[;;c]]. The "sandwich" construction specifically means "go from a to b in jumps of size c"; it's different from "chaining" ;;/Span commands through [[ ]]/Part.

POSTED BY: Arben Kalziqi
Posted 5 months ago

Anyone grok this list operation: Alphabet[][[;; 10 ;; 4]]

I understand Alphabet[]
I understand Alphabet[] [[;;10]]
I understand Alphabet[] [[;;4]]

I do not grok what's happening when the 2nd and 3rd statements are combined. I thought the ";;" operation acted like a pipe. The solution {a, e, i} isn't what I think a pipe should give.

POSTED BY: Coe Miles
Posted 5 months ago

Hi arben, Yes this is the tip of iceberg. I suggest you hash table as something to know. O(1) as a search algorithm. Hash tree and topology is a rich context to know

POSTED BY: Mauro Bertani
Posted 5 months ago

Thanks for teaching and I look forward to gaining new insight and learning the various facets of the Wolfram Language and learning to code with Mathematica. The course in this series labeled with #34 for the most part was attended, although completion of the course-work is latent. Hastily, without having differentiated or juxtaposed the two sets of files, I'm wondering about the development or difference thereof. Also, is this the appropriate place to provide commentary or share what you are learning or problems that you may be stuck on in the sense of posing a problem that is confounding?

For the sake of convenience, I have the following two lines for reference with the time zone set to GMT-8 for current locale the default being +1 given the supposed original temporal datum or original time where it is that the Vatican City state is presently, as well as central Europe and Scandinavia. This is just for contrasting disparate times along the lines of DateObject[] and use of SolarTime[] and MoonPosition[] for scheduling, thinking with respect to calendrical arithmetic or geo-computation for arranging one's day according to a plan in the sense of avoiding scheduling conflicts and slotting time around attendance of the course.

Transpose@{Alphabet["Greek"][[1;;10]]//Capitalize,(QuantityMagnitude/@Table[(a-DateObject[List[1,1,11,0,0,0],"Instant","Gregorian",1.`]),{a,{DateObject[{2024,1,29,9,0,0}],DateObject[{2024,1,30,9,0,0}],DateObject[{2024,1,31,9,0,0}],DateObject[{2024,2,1,9,0,0}],DateObject[{2024,2,2,9,0,0}],DateObject[{2024,2,5,9,0,0}],DateObject[{2024,2,6,9,0,0}],DateObject[{2024,2,7,9,0,0}],DateObject[{2024,2,8,9,0,0}],DateObject[{2024,2,9,9,0,0}]}}])//Ceiling//FactorInteger}//Grid

and also

TableForm[Transpose[List[List["Lists and Associations","Assignments, Rules and Patterns","Syntax and Expressions","Writing a Program","Good Coding Practices","Interfaces and Deployment","Working with Data, Part I","Working with Data, Part II", "Developing Packages","Review Session"],List[DateObject[{2024,1,29,9,0,0},"Instant","Gregorian", -8.`],DateObject[{2024,1,30,9,0,0}, "Instant", "Gregorian", -8.`], DateObject[{2024,1,31,9,0,0}, "Instant","Gregorian",-8.`],DateObject[{2024,2,1,9,0,0},"Instant","Gregorian",-8.`],DateObject[{2024,2,2,9,0,0},"Instant","Gregorian",-8.`],DateObject[{2024,2,5,9,0,0},"Instant","Gregorian",-8.`],DateObject[{2024,2,6,9,0,0}, "Instant", "Gregorian", -8.`],DateObject[{2024,2,7,9,0,0}, "Instant", "Gregorian",-8.`],DateObject[{2024,2,8,9,0,0},"Instant","Gregorian",-8.`],DateObject[{2024,2,9,9,0,0}, "Instant","Gregorian", -8.`]]]]]

With respect to this is the question of how to seamlessly integrate sharing of snippets of code like this in and that within Wolfram|One this was drafted and then the sequence was right click the "cell object delineator" (For lack of the proper term, assuming that is the incorrect phrase or string for a potential association) and then through the "drop down menu" "Plain Text" was selected and then "Alt + Tab" to navigate to Notepad and then "Ctrl + V" in the window after left clicking and then copying again via the aforementioned technique and then tabbing or repeatedly using the "Alt + Tab" macro/technique or combined key-press selecting the Microsoft Edge window and then again (As with Notepad via Windows 11) left-clicking and then pasting or using the "Ctrl + V" key-combination after left-clicking. This is rather cumbersome and tedious in the sense of efficacy with respect to the users resource of time (Avoiding philosophical subtleties with respect to the complexity classes and dichotomy in the sense of Kolmogorov & also the power tower or sequential binary operation, to provide an errant opinion in the mode of assumption). Perhaps accessing this page from within the Mathematica console or the Wolfram|One program such as what was mentioned earlier with external APIs in some way navigating a directory safely and in a maximally efficient manner with respect to augmentations such as keypress (Again, lacking the lingo or appropriate terminology with respect to this programming language or the sequence of expressions in the sense of algorithm).

One question is about accessing this course via BigMarker through a secure channel or learning about ports and other nuanced aspects in the sense of being conservative with data and being able to readily upload information through the WDF or contribute in real-time to the Wolfram Function Repository without removing attention from the lecture such as with alternate channels of data in the sense of active execution for formatting and the like.

Hopefully, I can provide less loquacious or verbose inquiries, yet the actual procedure of the computer program (I assume algorithm is correct in the sense of encapsulating it lexically or calling it by one word, as I imagine that I may do if there is audio programming and "calling" the server/use of the kernel involves univocal definitions and sensitivity in terms of attenuation) is what I'm curious about and I've deviated from solving the puzzles or producing a solution set, to my own detriment.

Given that so much time is spent with low-level calculations in Mathematica such as the above, a curiosity is with more compact functions such as with the pure function or defining the concept parametrically (Only having a vague notion of that at present, in the sense of a region that may be implicit, explicit, or parametric, according with abstract or universal geometry [rudimentary mathematical constructions and later demonstrations is a crucial project at present with developing thinking methodically or discerning the methodology, which I think that the Documentation Center does a good job of as it is worded, that I've noticed up until now, although one curiosity, further still, tangentially, is about the LinkSnooper and modifying the formatting with notebooks for stylesheets and whatnot. CloudDeploy[] was noted at 0713 0750 0203 and APIFunction[] on 0863 that date, although I currently lack knowledge of their utility with respect to rough outline of the aforementioned project, failin to attend/being truent for the course on May 16, 2023 on Programming Fundamentals. There is a wonder from 11439 about notation and Boolean Algebra with nn*ee, b^^nnnn, &&, ||, !, and <> about Element[] for the atomic expressions and use of Distributed[], UndirectedEdge[], DirectedEdge[] for Galois Theory (Which was, FiniteField[] and the related group theoretic constructs, experimental as of version 13.3.0) with there a curiosity about Polynomial Algebra and the S- and K-combinatorics with the Chief Executive Officer expounding work from December 1920 (Find WikipediaData@"Combinatory Logic" for a more concise elaboration) and use of bit-vectors in the aforementioned sense of a directory and efficacious navigation through WolframScript via the command line without a graphical interface.

738904.0199

POSTED BY: Updating Name

Hey Carl! Indeed, you can think of associations as constituting some "local map" between keys and values (and indeed, that might be part of the reason why they can be "indexed" with single brackets like functions can, though this is just a wild guess).

The primary value of associations in my view comes from the the organizational structure. For example, suppose I have a nested association:

scores=<|"Bob"-><|"Geography"->100,"Mathematics"->80,"Chemistry"->90|>,
"Alice"-><|"Geography"->90,"Mathematics"->100,"Chemistry"->85|>,
"Carol"-><|"Geography"->Missing["Absent"],"Mathematics"->100,"Chemistry"->95|>|>,

Now, without needing to remember which student or score is where, I can do something like:

scores["Bob"]

or:

scores["Bob","Chemistry"]

or:

scores[[All,"Mathematics"]]

This can be very useful for obvious reasons, especially as datasets get larger and more complicated.

We'll discuss this more later in the course, but you may recall that pure functions work with numbered, unnamed slots: #1+#2&[a,b] returns: a+b But this isn't the only way they can work—they can work with slots named by keys as well: #cat+#dog&[<|"cat"->1,"dog"->2|>] will return 3. This lets you write code that not only extracts the appropriate parts very easy, but performs various queries in a super readable and simple way. For example, the following code will select any students who have a chemistry score of 90 or higher: Select[scores,#Chemistry≥90&] Finally, from a technical perspective, it is faster to add or remove key-value pairs to an association than to add or remove elements with a list. This doesn't really crop up at the example scales we're talking about here, but can have an effect at larger sizes.

POSTED BY: Arben Kalziqi

Hi David, Apologies for the bad link in today's recording email. The one below should take you right to the folder: https://wolfr.am/WSG48_Programming_Profeciency

POSTED BY: Cassidy Hinkle

The link in the email I received doesn't work. How do I navigate to the materials folder? I looked around and didn't see an obvious link.

POSTED BY: David Snyder

Hey Arben,

I've not used associations before and I am trying to imagine what is their superpower. I'm not really a software writer, I just play one when I'm trying to study or solve engineering problems. One idea that jumps off the page is using a list of variable value assignments that can be summoned in a program without actually defining the variables outside of the context of the operation using them. That's kind of neat. I'd have to try that out and see if it makes a program easier to write or understand. But I suspect that's just the tip of the iceberg (as is everything else in the Wolfram language).

What do you say is the superpower in using associations?

POSTED BY: Carl Hahn

Hi everybody—I've added today's "filled-out" notebook to the materials folder. See you tomorrow!

POSTED BY: Arben Kalziqi

Daily recordings will be shared with the group each day, so you can catch up on any sessions you miss. Looking forward to it!

POSTED BY: Jamie Peterson

I can't make it at this time on MWF, but can on TTh.

POSTED BY: David Snyder
Reply to this discussion
Community posts can be styled and formatted using the Markdown syntax.
Reply Preview
Attachments
Remove
or Discard

Group Abstract Group Abstract