我需要一种算法来执行2D二分法来解决2x2非线性问题。例如:两个方程f(x,y)=0和g(x,y)=0我想somultaneously解决。我对一维二等分(以及其他数值方法)非常熟悉。假设我已经知道解决方案介于边界x1 < x < x2和之间y1 < y < y2。
在网格中,起始范围是:
^
| C D
y2 -+ o-------o
| | |
| | |
| | |
y1 -+ o-------o
| A B
o--+------+---->
x1 x2
Run Code Online (Sandbox Code Playgroud)
我知道的价值观f(A), f(B), f(C) and f(D),以及g(A), g(B), g(C) and g(D)。为了开始二等分,我想我们需要沿着边缘以及中间将点分开。
^
| C F D
y2 -+ o---o---o
| | |
|G o o M o H
| | |
y1 -+ o---o---o
| …Run Code Online (Sandbox Code Playgroud) language-agnostic math linear-algebra numerical-methods bisection
我很好奇大型结构的开销与使用运算符+和*数学的小结构.所以我做了两个结构,一个Small有1个双字段(8个字节),另一个Big有10个双字节(80个字节).在我的所有操作中,我只操纵一个叫做的字段x.
首先,我在两个结构中都定义了数学运算符
public static Small operator +(Small a, Small b)
{
return new Small(a.x + b.x);
}
public static Small operator *(double x, Small a)
{
return new Small(x * a.x);
}
Run Code Online (Sandbox Code Playgroud)
正如预期的那样,它会占用堆栈中的大量内存来复制字段.我运行了5,000,000次迭代的数学运算并得到了我怀疑的(3倍减速).
public double TestSmall()
{
pt.Start(); // pt = performance timing object
Small r = new Small(rnd.NextDouble()); //rnd = Random number generator
for (int i = 0; i < N; i++)
{
a = 0.6 * a + …Run Code Online (Sandbox Code Playgroud) 我正在寻找尝试理解字典中存储/检索机制的Item[TKey]来源Dictionary<TKey,TValue>,以及为什么它比仅逐个检查每个条目更快.
我迷茫的地方是在buckets场上的素数用户和相互作用Entry<TKey,TValue>.next.
有人可以向我解释逻辑,或指向我可以理解它的参考.
谢谢.
我有一个程序,它指定一个超出它界限的数组,我期待抛出运行时错误.然而,根本没有出现错误,程序继续写入未声明的内存.是否有一些编译器选项来防范这种情况?通过显示内存转储,很明显这种边界的超越是真实的.有没有办法声明变量或参数规范来捕获它?显然这是一个明显的案例,但是当负责维护数千行F77派生代码时,(对我来说)是否可能发生这种情况并不总是很清楚.
PROGRAM TEST_CODE
IMPLICIT NONE
INTEGER*4 :: R(5) ! Array of 5
CALL R_TEST(R, 10)
END PROGRAM
SUBROUTINE R_TEST(R, J)
IMPLICIT NONE
INTEGER*4, INTENT(INOUT) :: R(1) ! Dummy is array of 1
INTEGER*4, INTENT(IN) :: J
INTEGER*4 :: K
DO K=J-5,J+5 ! K=5..15
R(K) = K ! No Runtime Error
END DO
END SUBROUTINE
Run Code Online (Sandbox Code Playgroud)
编译器是英特尔Fortran 2011 XE,是的我使用字节规范,INTEGER*4因为我知道我得到它.
以下是运行时检查的编译器选项.


使用Fortran .dll的相同源文件,我可以使用Compaq Visual Fortran 6.6C或Intel Visual Fortran 12.1.3.300(IA-32)编译它们.问题是英特尔二进制文件的执行失败,但与Compaq一起运行良好.我正在Windows 7 64位系统上编译32位..dll调用驱动程序是写入的C#.
_chkstk()当调用内部子例程(从.dll入口例程调用)时,失败消息来自可怕的调用.(SO回答chkstk())
有问题的程序被声明为(原谅固定文件格式)
SUBROUTINE SRF(den, crpm, icrpm, inose, qeff, rev,
& qqmax, lvtyp1, lvtyp2, avespd, fridry, luin,
& luout, lurtpo, ludiag, ndiag, n, nzdepth,
& unit, unito, ier)
INTEGER*4 lvtyp1, lvtyp2, luin, luout, lurtpo, ludiag, ndiag, n,
& ncp, inose, icrpm, ier, nzdepth
REAL*8 den, crpm, qeff, rev, qqmax, avespd, fridry
CHARACTER*2 unit, unito
Run Code Online (Sandbox Code Playgroud)
并像这样调用:
CALL SRF(den, crpm(i), i, inose, qeff(i), rev(i),
& qqmax(i), lvtyp1, lvtyp2, …Run Code Online (Sandbox Code Playgroud) 请考虑此代码段并尝试猜测y1并y2评估
static class Extensions
{
public static Func<T> AsDelegate<T>(this T value)
{
return () => value;
}
}
class Program
{
static void Main(string[] args)
{
new Program();
}
Program()
{
double x = Math.PI;
Func<double> ff = x.AsDelegate();
Func<double> fg = () => x;
x = -Math.PI;
double y1 = ff(); // y1 = 3.141..
double y2 = fg(); // y2 = -3.141..
}
}
Run Code Online (Sandbox Code Playgroud)
您可能会说-Aha- double是一个值类型,因此扩展方法返回的值是main 的副本x.但是,当您将上述内容更改为类的委托时,结果仍然不同.例:
class Foo
{
public …Run Code Online (Sandbox Code Playgroud) 有sizeof()和typeof(),但为什么不memberinfo()返回的实例System.Reflection.MemberInfo为代码,以便在反射代码,以帮助选择的一部分.
例:
Program()
{
Type t = typeof(Foo);
Foo foo = new Foo();
PropertyInfo pi = memberinfo(Foo.Name) as PropertyInfo;
// or shall it be like this
// PropertyInfo pi = memberinfo(foo.Name) as PropertyInfo;
string name = pi.GetValue(foo, null);
}
Run Code Online (Sandbox Code Playgroud)
我试图了解是否有一个根本原因可以在C#规范中实现.
我不是在抨击任何事情,我只是在做一些一厢情愿的想法,所以请善待.
我有一个y = Ax + b形式的方程组,其中y,x和b是n×1向量,A是×n(对称)矩阵.
所以这里是皱纹.并非所有的x都是未知的.指定了某些x行,并且y的相应行未知.以下是一个例子
| 10 | | 5 -2 1 | | * | | -1 |
| * | = | -2 2 0 | | 1 | + | 1 |
| 1 | | 1 0 1 | | * | | 2 |
Run Code Online (Sandbox Code Playgroud)
其中,*指定未知数.
我已经为Fortran中的上述问题构建了一个求解器,但是我想知道是否有一个不错的鲁棒求解器作为Lapack或MLK的一部分用于这些类型的问题?
我的求解器基于一个排序矩阵,称为根据已知和未知pivot = [1,3,2]重新排列x …
我对F#完全不熟悉.我搜索了高低,但我找不到我想要的例子.
let A = [| 1.0, 2.0, 3.0, 4.0 |];; //maybe delimiter with ;
let B = [| 4.0, 3.5, 2.5, 0.5 |];;
let C = A + B;; //how do I define the addition operator for arrays?
// expect C=[| 5.0, 5.5, 5.5, 4.5 |]
Run Code Online (Sandbox Code Playgroud)
我已经接近这个帖子了,但这不是我想要的.