Don't feel stupid, but learn from your mistakes.
Go beyond "this works / this doesn't work":

> [c[i] for i in range(0..2)] <-- this doesn't work

Read error messages, they contain useful information.
```
sage: [c[i] for i in range(0..2)]
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-...> in <module>
----> 1 [c[i] for i in range(ellipsis_iter(Integer(0),Ellipsis,Integer(2)))]

TypeError: 'generator' object cannot be interpreted as an integer
```
Here, you can see that
- `range(0..2)` was preparsed as
  `range(ellipsis_iter(Integer(0),Ellipsis,Integer(2)))`,
- we get a type error because something (here: range)
  expected an integer and got something else
This gives a clue of what went wrong: range wants
integer arguments: range(2), range(1, 3);  but not
range of an ellipsis iteration like `0 .. 2`.

Now, about the proposed code after fixing this range mistake.

After defining:
```
sage: R = PolynomialRing(RR, 'c', 20)
sage: c = R.gens()
sage: c = vector([c[i] for i in (0 .. 2)])
sage: Z1 = matrix([[1, 2], [3, 4]])*vector([c[1], c[2]])
```
we have:
```
sage: Z1
(c1 + 2.00000000000000*c2, 3.00000000000000*c1 + 4.00000000000000*c2)
sage: Z1[0]
c1 + 2.00000000000000*c2
```

This `Z1[0]` is a polynomial, not a symbolic expression:
```
sage: parent(Z1[0])
Multivariate Polynomial Ring in c0, c1, c2, ..., c18, c19
over Real Field with 53 bits of precision
```

So `== 0` tests whether it is zero:
```
sage: Z1[0] == 0
False
```
and does not give a symbolic equation.

To get an equation, convert `Z1[0]` to the symbolic ring:
```
sage: SR(Z1[0]) == 0
1.00000000000000*c1 + 2.00000000000000*c2 == 0
```

To use `solve`, both the equation and the variable
must be in the symbolic ring.

Converting polynomial variables over the floating-point reals `RR`
to symbolic variables is a little more tricky:
```
sage: SR(c[1])
1.00000000000000*c1
sage: SR(c[1]).variables()[0]
c1
```

>From there:
```
sage: solve(SR(Z1[0]) == 0, SR(c[1]).variables()[0])
[c1 == -2*c2]
```

Working over the integers or the rationals simplifies things a bit:
```
sage: R = PolynomialRing(QQ, 'c', 20)
sage: c = vector(R.gens())
sage: c[1:3]
(c1, c2)
sage: Z1 = matrix([[1, 2], [3, 4]])*c[1:3]
sage: Z1
(c1 + 2*c2, 3*c1 + 4*c2)
sage: Z1[0]
c1 + 2*c2
sage: SR(Z1[0])
c1 + 2*c2
sage: SR(c[1])
c1
sage: solve(SR(Z1[0]) == 0, SR(c[1]))
[c1 == -2*c2]
```

Note that for equations of the form `== 0`,
you can skip the `== 0` when calling `solve`,
feeding it only the left hand side:
```
sage: solve(SR(Z1[0]), SR(c[1]))
[c1 == -2*c2]
```

-- 
You received this message because you are subscribed to the Google Groups 
"sage-support" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to sage-support+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/sage-support/ef4c405c-7160-41fa-96c0-522fcde7cfa4n%40googlegroups.com.

Reply via email to