Carl Love

## 26832 Reputation

11 years, 289 days
Himself
Wayland, Massachusetts, United States
My name was formerly Carl Devore.

## Change the subs line...

@emma hassan Change the subs command from subs({...}, Points) to

subs(XY, op(SOL), BC, Points);

There should not be any curly braces {}, and the order is important: BC must come after op(SOL).

## Not a limit on Matrix size...

@marc005 This limit, if it exists at all, is definitely not a limitation on Matrix size; it is a limit on the size of a Matrix that can be displayed in the browser.

You can easily select chunks of a large Matrix for browsing. Say M is the Matrix,

M[r1..r2, c1..c2]

gives (rows r1 to r2) X (columns c1 to c2).

## Boundary conditions...

@emma hassan I think that the values of U[0,4], ..., U[3,4] need to be filled by the boundary conditions. I don't think that they are meant to be solved for. I don't know enough about this type of problem to help you more with that.

Regardless of that, once the boundary grid points have values assigned, the commands are still GenerateMatrix and LinearSolve.

## Boundary conditions...

@emma hassan I think that the values of U[0,4], ..., U[3,4] need to be filled by the boundary conditions. I don't think that they are meant to be solved for. I don't know enough about this type of problem to help you more with that.

Regardless of that, once the boundary grid points have values assigned, the commands are still GenerateMatrix and LinearSolve.

## Simpler version...

I had used "%0.5s" as the output format code, which specifes a minimum width of 0 and a maximum width of 5. This can be simplified to just "%s" because the strings being passed in already have a maximum length of 5. Since the format code does not depend of the block length, there's no need for the variable WFO. So the final command can become

sprintf(cat("%s", " %s" \$ words-1), sscanf(T, cat(WFI \$ words))[]);

Notice the space before the second %s. That's what puts the spaces between the blocks.

## Simpler version...

I had used "%0.5s" as the output format code, which specifes a minimum width of 0 and a maximum width of 5. This can be simplified to just "%s" because the strings being passed in already have a maximum length of 5. Since the format code does not depend of the block length, there's no need for the variable WFO. So the final command can become

sprintf(cat("%s", " %s" \$ words-1), sscanf(T, cat(WFI \$ words))[]);

Notice the space before the second %s. That's what puts the spaces between the blocks.

## Anomaly...

@acer My results agree with yours now. I don't know what happened that caused my earlier results. May I assume that your results otherwise agree with mine: that additionally causes an additional copy of the variable to be created?

## Anomaly...

@acer My results agree with yours now. I don't know what happened that caused my earlier results. May I assume that your results otherwise agree with mine: that additionally causes an additional copy of the variable to be created?

## Version 17.00...

@acer Version 17.00. Do you get different results in another version?

## Version 17.00...

@acer Version 17.00. Do you get different results in another version?

## Order of assumptions doesn't matter...

@Markiyan Hirnyk You wrote:

After reading your long comment I still don't understand why the code works with
but it does not work with

Andriy's four examples above show that the order that the assumptions are made does not matter. What matters is whether there is an assignment between the assume and additionally that saves the intermediate version of the assumed variable.

## Order of assumptions doesn't matter...

@Markiyan Hirnyk You wrote:

After reading your long comment I still don't understand why the code works with
but it does not work with

Andriy's four examples above show that the order that the assumptions are made does not matter. What matters is whether there is an assignment between the assume and additionally that saves the intermediate version of the assumed variable.

## assume(a::complex) not needed...

@Andriy I certainly agree that this thing where additionally creates a third copy of the variable is a bad design (not sure if it's by design or unintended and hence a bug). But, for what it's worth, I'll point out that assuming d::complex is redundant in this case. It seems that assuming an inequation automatically includes the complex assumption, as the following shows:

restart;
#assume nothing
evalc(Re(a));
a
assume(a<>0);
evalc(Re(a));
Re(a~)
restart;
assume(a::complex);
evalc(Re(a));
Re(a~)

## assume(a::complex) not needed...

@Andriy I certainly agree that this thing where additionally creates a third copy of the variable is a bad design (not sure if it's by design or unintended and hence a bug). But, for what it's worth, I'll point out that assuming d::complex is redundant in this case. It seems that assuming an inequation automatically includes the complex assumption, as the following shows:

restart;
#assume nothing
evalc(Re(a));
a
assume(a<>0);
evalc(Re(a));
Re(a~)
restart;
assume(a::complex);
evalc(Re(a));
Re(a~)

 First 656 657 658 659 660 661 662 Last Page 658 of 693
﻿