This problem has been filed <https://sourceforge.net/p/maxima/bugs/4032/> in Maxima’s bug report system.
Should a Sage ticket be filed ? Le dimanche 9 octobre 2022 à 19:55:07 UTC+2, Florian Königstein a écrit : > Thank you for your efforts. > > Yes, it was me who posted the original post > https://ask.sagemath.org/question/64344/solving-a-system-of-linear-equations-with-complex-numbers-yields-false-solution/ > > . > I think my member name "Albert Zweistein" (allusion to Albert Einstein) > is a bit snobbish. Is there a way to change the name in ask.sagemath.org ? > > I received your posts while I was writing my post. > Since it seems to be clear now that it's a bug, I only write (as > additional information) from where I got the equations. > > But for fixing the bug the following information in absolutely not > necessary: > > For those who have some knowledge of analysis of electrical circuits with > complex numbers: In the attachment I have an image > of the circuit from that I have generated the equations with the mesh > current analysis. The physical time-dependent values for > voltages and currents are of course real, but you calculate with complex > numbers: If the driving voltage is described with the complex > number U, the physical voltage is by definition the real part of > U*exp(I*w*t) , where t is the time. Correspondingly e.g. the physical > current i1 is > equal to the real part of I1*exp(I*w*t). > > Physically the inductances L1, L2, L3 and the mutual inductance M23 are > real and positive, but for design purposes you could also > allow them to get negative (then you would replace a negative inductance > by a capacitor if you know the frequency of the driving voltage). > The capacitances C1, C2, C3 are also real and normally positive, but for > design purposes you could also allow negative values. > The resistance RL is normally positive (or may be zero). > The angular frequency w is real and nonnegative, and so p = I*w is purely > imaginary. > [image: Circuit.png] > dim...@gmail.com schrieb am Sonntag, 9. Oktober 2022 um 18:55:26 UTC+2: > >> Sorry, I mistook U in the RHS of the 1st equation for 0, and so what I >> wrote only applies to the case U=0. >> For U nonzero, one can write a generic solution, with A being full rank, >> using the Cramer rule. >> >> Although there could be more solutions with det(A)=0, and U being >> nonzero, as well. >> >> >> On Sunday, October 9, 2022 at 1:15:57 PM UTC+1 Dima Pasechnik wrote: >> >>> On Sun, Oct 9, 2022 at 9:23 AM David Joyner <wdjo...@gmail.com> wrote: >>> > >>> > On Sun, Oct 9, 2022 at 3:25 AM Florian Königstein <niets...@gmail.com> >>> wrote: >>> > > >>> > > I have equations for the analysis of an electric circuit. They >>> contain at several places the term w*I (I is the imaginary unit). I get a >>> solution for the currents I1, I2, I3, I4. Then I substitute the solution >>> into the equations, but I see that two of the four equations are not >>> fulfilled: >>> > > >>> > > var('L1 L2 L3 L4 C1 C2 C3 C4 M23 I1 I2 I3 I4 U w p RL') >>> > > >>> > > lsg = solve([I1*(w*I*L1 + 1/(w*I*C1)) + I2*(-1/(w*I*C1) ) == U, \ >>> > > I2*(w*I*L2 + 1/(w*I*C1) + 1/(w*I*C2)) + I3*(w*I*M23 - 1/(w*I*C2)) + >>> I1*(- 1/(w*I*C1)) == 0, \ >>> > > I3*(1/(w*I*C3) + w*I*L3 + 1/(w*I*C2)) + I2*(w*I*M23 - 1/(w*I*C2)) - >>> I4/(w*I*C3) == 0, \ >>> > > I4/(w*I*C3) + I4*RL - I3/(w*I*C3) == 0], \ >>> > > [I1, I2, I3, I4]) >>> >>> This is a homogeneous 4x4 linear system, it will only have nonzero >>> solutions where the determinant of its matrix >>> vanishes. If you'd like to analyse the determinant, best is to work >>> with polynomials, not symbolic variables. >>> >>> ii=QQ['ii'].0 >>> C.<ii>=NumberField(ii^2+1) >>> K.<w,L1,C1,L2,C2,M23,C3,L3,RL>=C[] # replacing I by ii, I is too >>> special in Sage... >>> # I1 I2 I3 I4 >>> A=matrix(K.fraction_field(), [ >>> [w*ii*L1+1/(w*ii*C1),-1/(w*ii*C1), 0, >>> 0 ], >>> [-1/(w*ii*C1), w*ii*L2+1/(w*ii*C1)+1/(w*ii*C2), w*ii*M23 - >>> 1/(w*ii*C2), 0 ], >>> [0, w*ii*M23-1/(w*ii*C2), >>> 1/(w*ii*C3)+w*ii*L3+1/(w*ii*C2), -1/(w*ii*C3) ], >>> [0, 0, -1/(w*ii*C3), >>> 1/(w*ii*C3) + RL] >>> ]) >>> >>> >>> sage: load('x.sage') >>> sage: A.det().factor() >>> (ii) * w^-3 * C3^-1 * C2^-1 * C1^-1 * (w^6*L1*C1*C2*M23^2*C3*RL - >>> w^6*L1*C1*L2*C2*C3*L3*RL + (-ii)*w^5*L1*C1*C2*M23^2 + >>> ii*w^5*L1*C1*L2*C2*L3 + w^4*L1*C1*L2*C2*RL + w^4*L1*C1*L2*C3*RL + >>> 2*w^4*L1*C1*M23*C3*RL - w^4*C2*M23^2*C3*RL + w^4*L1*C1*C3*L3*RL + >>> w^4*L1*C2*C3*L3*RL + w^4*L2*C2*C3*L3*RL + (-ii)*w^3*L1*C1*L2 + >>> (-2*ii)*w^3*L1*C1*M23 + ii*w^3*C2*M23^2 + (-ii)*w^3*L1*C1*L3 + >>> (-ii)*w^3*L1*C2*L3 + (-ii)*w^3*L2*C2*L3 - w^2*L1*C1*RL - w^2*L1*C2*RL >>> - w^2*L2*C2*RL - w^2*L1*C3*RL - w^2*L2*C3*RL - 2*w^2*M23*C3*RL - >>> w^2*C3*L3*RL + ii*w*L1 + ii*w*L2 + (2*ii)*w*M23 + ii*w*L3 + RL) >>> >>> You haven't told us what ranges your parameters have (some constraints >>> can be seen from the matrix, e.g. C1, C2, C3, and w cannot be 0). >>> E.g. if they are all reals then det(A)=0 is actually 2 equations, one >>> for real and one for the imaginary part. >>> >>> It's also remarkable that A is tridiagonal, and so one can rather >>> easily write, assuming I1 nonzero (if I1=0 then I2=0, and this is a >>> much easier problem), >>> an expression for I2 in terms of I1 (and entries of 1st row of A), >>> I3 in terms of I1, I2, and the 1st and 2nd row of A (assuming >>> w*ii*M23 - 1/(w*ii*C2) is not zero - if it is zero, then you have two >>> indendent blocks in A, again a much >>> easier problem). >>> Finally, I4 can be expressed in terms of I1,I2,I3 and entries of A in >>> two different ways - one using the 3rd row of A, another using 4th row >>> of A. >>> These two expressions must obviosuly be equal (which will only happen >>> if det(A)=0). >>> So it seems one can gather a lot of info about all the possible >>> solutions, or even write down a full answer. >>> >>> Hope this helps, >>> Dima >>> >>> >>> >>> >>> >>> > > >>> > > param = [w==1, U==1, C1==1, C2==1, C3==1, C4==1, L1==1, L2==1, >>> L3==1, L4==1, RL==1, M23==0] >>> > > I1 = I1.subs(lsg).subs(param) >>> > > I2 = I2.subs(lsg).subs(param) >>> > > I3 = I3.subs(lsg).subs(param) >>> > > I4 = I4.subs(lsg).subs(param) >>> > > >>> > > eqn = [I1*(w*I*L1 + 1/(w*I*C1)) + I2*(-1/(w*I*C1) ) == U, \ >>> > > I2*(w*I*L2 + 1/(w*I*C1) + 1/(w*I*C2)) + I3*(w*I*M23 - 1/(w*I*C2)) + >>> I1*(- 1/(w*I*C1)) == 0, \ >>> > > I3*(1/(w*I*C3) + w*I*L3 + 1/(w*I*C2)) + I2*(w*I*M23 - 1/(w*I*C2)) - >>> I4/(w*I*C3) == 0, \ >>> > > I4/(w*I*C3) + I4*RL - I3/(w*I*C3) == 0] >>> > > >>> > > print("I1=", I1) >>> > > print("I2=", I2) >>> > > print("I3=", I3) >>> > > print("I4=", I4) >>> > > [eq.subs(param) for eq in eqn] >>> > > >>> > > Output (unexpected): >>> > > >>> > > I1= 1 >>> > > I2= -I >>> > > I3= -2 >>> > > I4= I - 1 >>> > > [1 == 1, (-I - 1) == 0, I == 0, 0 == 0] >>> > > >>> > > I have copied and pasted the equations from within the solve() >>> command into the eqn = ... statement. So they are guaranteed to be equal. >>> > > >>> > > Because I have set M23=0 in the parameters, I could remove the terms >>> with M23 in the equations. Then I get the correct solution. I don't >>> understand why not when M23 is present. >>> > > >>> > >>> > I think you essentially answered your own question. IMHO, the symbolic >>> > solver implicitly assumes a symbolic parameter is non-zero when >>> > solving for the other variables. It looks like your equations are >>> > linear in the variables to be solved for and so the solver is using >>> > row reduction at some point., which of course involves divisions by >>> > (presumably non-zero) expressions in the parameters. >>> > >>> > > Another way to get the correct solution is replacing w*I with p in >>> the equations and setting p=I in the parameters: >>> > > >>> > > var('L1 L2 L3 L4 C1 C2 C3 C4 M23 I1 I2 I3 I4 U w p RL') >>> > > >>> > > lsg = solve([I1*(p*L1 + 1/(p*C1)) + I2*(-1/(p*C1) ) == U, \ >>> > > I2*(p*L2 + 1/(p*C1) + 1/(p*C2)) + I3*(p*M23 - 1/(p*C2)) + I1*(- >>> 1/(p*C1)) == 0, \ >>> > > I3*(1/(p*C3) + p*L3 + 1/(p*C2)) + I2*(p*M23 - 1/(p*C2)) - I4/(p*C3) >>> == 0, \ >>> > > I4/(p*C3) + I4*RL - I3/(p*C3) == 0], \ >>> > > [I1, I2, I3, I4]) >>> > > >>> > > param = [p==I, U==1, C1==1, C2==1, C3==1, C4==1, L1==1, L2==1, >>> L3==1, L4==1, RL==1, M23==0] >>> > > I1 = I1.subs(lsg).subs(param) >>> > > I2 = I2.subs(lsg).subs(param) >>> > > I3 = I3.subs(lsg).subs(param) >>> > > I4 = I4.subs(lsg).subs(param) >>> > > >>> > > eqn = [I1*(p*L1 + 1/(p*C1)) + I2*(-1/(p*C1) ) == U, \ >>> > > I2*(p*L2 + 1/(p*C1) + 1/(p*C2)) + I3*(p*M23 - 1/(p*C2)) + I1*(- >>> 1/(p*C1)) == 0, \ >>> > > I3*(1/(p*C3) + p*L3 + 1/(p*C2)) + I2*(p*M23 - 1/(p*C2)) - I4/(p*C3) >>> == 0, \ >>> > > I4/(p*C3) + I4*RL - I3/(p*C3) == 0] >>> > > >>> > > print("I1=", I1) >>> > > print("I2=", I2) >>> > > print("I3=", I3) >>> > > print("I4=", I4) >>> > > [eq.subs(param) for eq in eqn] >>> > > >>> > > Output as expected: >>> > > >>> > > I1= 1 >>> > > I2= -I >>> > > I3= -I - 1 >>> > > I4= -1 >>> > > [1 == 1, 0 == 0, 0 == 0, 0 == 0] >>> > > >>> > > When not inserting the numeric parameters, I get the solution in >>> dependence of p (or w), U, C1, C2, L1, L2, M12 and RL. The common >>> denominator of the currents I1, I2, I3, I4 should be the determinant of the >>> matrix (up to a constant factor) if you would write the system in >>> matrix-times-vector form. The denominator is correct both if I use p in the >>> system and if I use I*w instead of p. But the numerators are not correct, >>> at least for I4. >>> > > >>> > > I would like the future of CAS to be in open source like sagemath, >>> but since I used Maple in the past, I begin with some code and results from >>> Maple: >>> > > >>> > > Maple code: >>> > > eqn1 := [I1*(p*L1 + 1/(p*C1)) + I2*(-1/(p*C1) ) = U, >>> > > I2*(p*L2 + 1/(p*C1) + 1/(p*C2)) + I3*(p*M23 - 1/(p*C2)) + I1*(- >>> 1/(p*C1)) = 0, >>> > > I3*(1/(p*C3) + p*L3 + 1/(p*C2)) + I2*(p*M23 - 1/(p*C2)) - I4/(p*C3) >>> = 0, >>> > > I4/(p*C3) + I4*RL - I3/(p*C3) = 0]: >>> > > eqn2 := [seq(subs(p=I*w, eqn1[i]), i=1..4)]: >>> > > lsg1 := solve(eqn1, [I1, I2, I3, I4])[1]: >>> > > lsg2 := solve(eqn2, [I1, I2, I3, I4])[1]: >>> > > print(simplify((subs(p=I*w, subs(lsg1, I4)) - subs(lsg2, I4)))); # >>> expected to be zero >>> > > >>> > > Output is zero as expected. >>> > > >>> > > Maple code: >>> > > print(subs(lsg2, I4)); >>> > > >>> > > Output: >>> > > >>> > > >>> -(C2*M23*w^2+1)*U/(-(2*I)*M23*w+(2*I)*C1*L1*M23*w^3-I*C2*M23^2*w^3-RL+C1*L1*RL*w^2+C2*L1*RL*w^2+C3*L1*RL*w^2+C2*L2*RL*w^2+C3*L2*RL*w^2+C3*L3*RL*w^2+2*C3*M23*RL*w^2-I*L1*w-I*L2*w-I*L3*w-C1*C2*L1*L2*RL*w^4-C1*C3*L1*L2*RL*w^4-C1*C3*L1*L3*RL*w^4-C2*C3*L1*L3*RL*w^4-C2*C3*L2*L3*RL*w^4-2*C1*C3*L1*M23*RL*w^4+I*C1*C2*L1*M23^2*w^5-C1*C2*C3*L1*M23^2*RL*w^6-I*C1*C2*L1*L2*L3*w^5+C1*C2*C3*L1*L2*L3*RL*w^6+C2*C3*M23^2*RL*w^4+I*C1*L1*L2*w^3+I*C1*L1*L3*w^3+I*C2*L1*L3*w^3+I*C2*L2*L3*w^3) >>> >>> >>> > > >>> > > Maple code: >>> > > print(numer(subs(lsg2, I4))); # numerator of I4 from lsg2 >>> > > >>> > > Output: >>> > > >>> > > -(C2*M23*w^2+1)*U >>> > > >>> > > Maple code: >>> > > print(denom(subs(lsg2, I4))); # denominator of I4 from lsg2 >>> > > >>> > > Output: >>> > > >>> > > >>> -(2*I)*M23*w+(2*I)*C1*L1*M23*w^3-I*C2*M23^2*w^3-RL+C1*L1*RL*w^2+C2*L1*RL*w^2+C3*L1*RL*w^2+C2*L2*RL*w^2+C3*L2*RL*w^2+C3*L3*RL*w^2+2*C3*M23*RL*w^2-I*L1*w-I*L2*w-I*L3*w-C1*C2*L1*L2*RL*w^4-C1*C3*L1*L2*RL*w^4-C1*C3*L1*L3*RL*w^4-C2*C3*L1*L3*RL*w^4-C2*C3*L2*L3*RL*w^4-2*C1*C3*L1*M23*RL*w^4+I*C1*C2*L1*M23^2*w^5-C1*C2*C3*L1*M23^2*RL*w^6-I*C1*C2*L1*L2*L3*w^5+C1*C2*C3*L1*L2*L3*RL*w^6+C2*C3*M23^2*RL*w^4+I*C1*L1*L2*w^3+I*C1*L1*L3*w^3+I*C2*L1*L3*w^3+I*C2*L2*L3*w^3 >>> >>> >>> > > >>> > > Sagemath code: >>> > > var('L1 L2 L3 L4 C1 C2 C3 C4 M23 I1 I2 I3 I4 U w p RL') >>> > > >>> > > eqn1 = [I1*(p*L1 + 1/(p*C1)) + I2*(-1/(p*C1) ) == U, \ >>> > > I2*(p*L2 + 1/(p*C1) + 1/(p*C2)) + I3*(p*M23 - 1/(p*C2)) + I1*(- >>> 1/(p*C1)) == 0, \ >>> > > I3*(1/(p*C3) + p*L3 + 1/(p*C2)) + I2*(p*M23 - 1/(p*C2)) - I4/(p*C3) >>> == 0, \ >>> > > I4/(p*C3) + I4*RL - I3/(p*C3) == 0] >>> > > >>> > > eqn2 = [eq.subs(p=I*w) for eq in eqn1] >>> > > >>> > > lsg1 = solve(eqn1, [I1, I2, I3, I4]) >>> > > lsg2 = solve(eqn2, [I1, I2, I3, I4]) >>> > > >>> > > #print((I4.subs(lsg1).subs(p=I*w) - I4.subs(lsg2))) # expected to be >>> zero but yields long nonzero expression >>> > > print(I4.subs(lsg1).subs(p=I*w)) >>> > > >>> > > Output: >>> > > >>> > > -(C2*M23*U*w^2 + U)/((C2*C3*L2*L3*RL - C2*C3*M23^2*RL)*C1*L1*w^6 - >>> I*(C2*L2*L3 - C2*M23^2)*C1*L1*w^5 - (C2*C3*L2*L3*RL - C2*C3*M23^2*RL + >>> (C2*C3*L3*RL + (C3*L3*RL + 2*C3*M23*RL + (C2*RL + C3*RL)*L2)*C1)*L1)*w^4 + >>> I*(C2*L2*L3 - C2*M23^2 + (C1*(L2 + L3 + 2*M23) + C2*L3)*L1)*w^3 + (C3*L3*RL >>> + 2*C3*M23*RL + (C1*RL + C2*RL + C3*RL)*L1 + (C2*RL + C3*RL)*L2)*w^2 - >>> I*(L1 + L2 + L3 + 2*M23)*w - RL) >>> > > >>> > > Sagemath code: >>> > > print(I4.subs(lsg2)) >>> > > >>> > > Output: >>> > > >>> > > (I*C2*C3*M23*RL*U*w^3 + C2*M23*U*w^2 + I*C3*RL*U*w + >>> U)/(-I*(C2*C3*L2*L3*RL - C2*C3*M23^2*RL)*C1*L1*w^6 - (C2*L2*L3 - >>> C2*M23^2)*C1*L1*w^5 + (I*C2*C3*L2*L3*RL - I*C2*C3*M23^2*RL + (I*C2*C3*L3*RL >>> + I*(C3*L3*RL + 2*C3*M23*RL + (C2*RL + C3*RL)*L2)*C1)*L1)*w^4 + (C2*L2*L3 - >>> C2*M23^2 + (C1*(L2 + L3 + 2*M23) + C2*L3)*L1)*w^3 + (-I*C3*L3*RL - >>> 2*I*C3*M23*RL + (-I*C1*RL - I*C2*RL - I*C3*RL)*L1 - I*(C2*RL + >>> C3*RL)*L2)*w^2 - (L1 + L2 + L3 + 2*M23)*w + I*RL) >>> > > >>> > > Sagemath code: >>> > > print((denominator(I4.subs(lsg1)).subs(p=I*w) / >>> denominator(I4.subs(lsg2))).simplify_full()) >>> > > >>> > > Output: >>> > > >>> > > I >>> > > >>> > > Sagemath code: >>> > > print((denominator(I4.subs(lsg1)).subs(p=I*w) - >>> I*denominator(I4.subs(lsg2))).simplify_full()) # yields zero since previous >>> quotiont is I >>> > > >>> > > Output: >>> > > >>> > > 0 >>> > > >>> > > Sagemath code: >>> > > print((numerator(I4.subs(lsg1)).subs(p=I*w) - >>> I*numerator(I4.subs(lsg2))).simplify_full()) # expected to be zero >>> > > >>> > > Output: >>> > > >>> > > -C2*C3*M23*RL*U*w^3 + (I + 1)*C2*M23*U*w^2 - C3*RL*U*w + (I + 1)*U >>> > > >>> > > Sagemath code: >>> > > print(numerator(I4.subs(lsg1)).subs(p=I*w)) >>> > > >>> > > Output: >>> > > >>> > > C2*M23*U*w^2 + U >>> > > >>> > > Sagemath code: >>> > > print(numerator(I4.subs(lsg2))) >>> > > >>> > > Output: >>> > > >>> > > -I*C2*C3*M23*RL*U*w^3 - C2*M23*U*w^2 - I*C3*RL*U*w - U >>> > > >>> > > For me it looks that it could be a bug in sagemath. If not, I would >>> like to know why sagemath behaves like this. >>> > > >>> > > -- >>> > > You received this message because you are subscribed to the Google >>> Groups "sage-devel" group. >>> > > To unsubscribe from this group and stop receiving emails from it, >>> send an email to sage-devel+...@googlegroups.com. >>> > > To view this discussion on the web visit >>> https://groups.google.com/d/msgid/sage-devel/8d56151f-5295-455c-a86e-92ae1a04cf88n%40googlegroups.com. >>> >>> >>> > >>> > -- >>> > You received this message because you are subscribed to the Google >>> Groups "sage-devel" group. >>> > To unsubscribe from this group and stop receiving emails from it, send >>> an email to sage-devel+...@googlegroups.com. >>> > To view this discussion on the web visit >>> https://groups.google.com/d/msgid/sage-devel/CAEQuuAWVd%2Bg7xy74NVA40oYuwHPGL3oys6iz42htAgSMCO%3Db5Q%40mail.gmail.com. >>> >>> >>> >> -- You received this message because you are subscribed to the Google Groups "sage-devel" group. To unsubscribe from this group and stop receiving emails from it, send an email to sage-devel+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/sage-devel/e0b32aee-3338-435d-aebc-6c213e33d261n%40googlegroups.com.