On Fri, Aug 14, 2020, 12:05 AM Stephen J. Turnbull <
turnbull.stephen...@u.tsukuba.ac.jp> wrote:

> I cannot speak to engineering uses of matrix computations.  If someone
>
produces use cases that fit into the list of operations proposed
> (addition, negation, multiplication, inverse, transposition, scalar
> multiplication, solving linear equation systems, and determinants, I
> will concede it's useful and fall back to +/- 0.
>

I'll try to speak to that below.

On Fri, Aug 14, 2020, 1:48 AM Marco Sulla <marco.sulla.pyt...@gmail.com>
wrote:

On Fri, 14 Aug 2020 at 03:16, Steven D'Aprano <st...@pearwood.info> wrote:
> Funny you mention this, I have been working on a Matrix object for
> precisely the use-case you discuss (secondary school maths), where
> performance is not critical and the dimensions of the matrix is
> typically single digits.

This is really good. I think that numpy is a practical project, but I
feel it hard to understand for people that come from Python and not
from Matlab.
Maybe the API for such a module can be released initially as a
provisional API, as at the pathlib and asyncio beginnings?


I agree this could be great. I would characterize the steps to get to
matrix arithmetic in python as currently something like:

1. Learn python, with typical experience of:
- I learned it last night! Everything is so simple!
2. Learn numpy, with the typical experience of:
- Wait, is this array thing really what I need? I am looking for matrix.
- This is kind of intimidating and after a few hours I barely feel
confident I can add matrices together correctly... also, why did this
tutorial cause me to spend half a day figuring out virtual environments?
And this other tutorial doesn't even mention them? And this other one says
never to install things without using them? Did I hurt my computer by
putting numpy on it?

It's tough.

However, engineers aren't usually doing a lot of linear algebra. Linear
algebra isn't even a required course in ABET accredited university engineer
programs. I walked out of my linear algebra course the first day, saying to
myself, "nope, I have written my last proof."

What is used is mostly NOT even matrix arithmetic of the high school
variety (although it's occasionally useful to solve a system of equations).
I'll give a longish example below.

The other thing I would say is there are some nice third party tools out
there that assume numpy is being used (I use pint a lot for units, and of
course there's notebooks like jupyter). Might be a good thing to see if the
API for basic matrix objects can be made to work well with some of these
existing tools.

Here's my example code-- I utilize a lot of this sort of thing. Skip down
this large block of code to see the lines that exemplify the reason I'm
using a numpy array in the first place.

#  Nominal skin friction capacity, Pn, of drilled shafts/piers

## depths below grade to 20 ft in 1 foot increments
z = np.linspace(1, 20, num=20)

## create array containing unit weight of soil at each depth

### unit weight log
### for looking up unit weights (pcf) based on depth (ft)
### of form {depth: unit_weight}
log = {3: 120, 9: 118, 12: 122, 15: 106, 18: 102, 21: 110}

### fill in gaps in unit weight log
#### assume first layer extends to ground surface
log[0] = log[next(iter(log))]
#### assume unit weight change occurs after mid point between each layer
log_depths = sorted(list(log.keys()))
log_filled = {}
for depth, next_depth in zip(log_depths[:-1], log_depths[1:]):
    # layer boundary
    log_filled[depth] = log[depth]
    # layer change occurs after midpoint of boundary
    log_filled[ (depth+next_depth)/2 ] = log[depth]
#### don't forget bottom of last layer
log_filled[next_depth] = log[next_depth]
#### final per foot unit weights, γ
γ_per_ft = np.array([])
for depth in z:
    log_depth = next(d for d in log_filled if d >= depth)
    γ_per_ft = np.append(uwt_per_ft, log_filled[log_depth])

## calculate per foot stress

### unit weight of water (pcf)
γ_w = 62.4

### effective unit weight given high water table
γ_prime = γ_per_foot - γ_w

q_s = γ_prime * z

## Nominal capacity

### shaft diameter (ft)
D_shaft = 6

### shaft circumference
C_shaft = D_shaft * np.pi

# friction coefficient
friction_angle = 17  # degrees
μ_s = np.tan( friction_angle * np.pi/180 )

# nominal vertical capacity
P_n_per_foot = μ_s * q_s * C_shaft
P_n = np.sum(P_n_per_foot)

This operation:

q_s = γ_prime * z

And these operations:

P_n_per_foot = μ_s * q_s * C_shaft
P_n = np.sum(P_n_per_foot)

...which are just scalar or element-wise multiplication and summation, are
pretty much the extent of the kinds of mathematical things an engineer is
doing with numpy arrays- at least the majority of the time. We just
generally are not doing linear algebra.

That being said, I do think it would be nice to have a "matrix" type in the
std lib that supported both element-wise operations like this and basic
matrix arithmetic.

>
_______________________________________________
Python-ideas mailing list -- python-ideas@python.org
To unsubscribe send an email to python-ideas-le...@python.org
https://mail.python.org/mailman3/lists/python-ideas.python.org/
Message archived at 
https://mail.python.org/archives/list/python-ideas@python.org/message/32KI2OJXEGHWHMWOIDQ5EMYEAJ3BIDJB/
Code of Conduct: http://python.org/psf/codeofconduct/

Reply via email to