(注意:这是一个社区Wiki.)
假设我有一组点xi = { x0,x1,x2,... xn }和相应的函数值fi = f(xi)= { f0,f1,f2,...,fn },其中f(x),一般来说,是一个未知的功能.(在某些情况下,我们可能提前知道f(x),但我们想要这样做,因为我们通常不提前知道f(x).)什么是近似f的导数的好方法(x)在每个点xi?也就是说,如何在每个点xi处估计dfi == d/d x fi == d f(xi)/ d x的值?
不幸的是,MATLAB没有一个非常好的通用数值微分程序.造成这种情况的部分原因可能是因为选择一个好的例程可能很困难!
那有什么样的方法呢?有哪些例程?我们如何为特定问题选择一个好的例行程序?
在选择如何区分MATLAB时,有几个注意事项:
什么是最好的方法?
我希望解决一般的线性方程组A*x = b.m-by-m矩阵是稀疏的,实数,正方形,条件稍差,非对称,但它是奇异的(秩(A)== m-1),因为x
只知道一个加性常数.
我可以通过在三个矢量(指定其非零项创建矩阵A i
,j
和v
),使得A(i(k),j(k)) = v(k)
:
A = sparse( i, j, v, m, m );
Run Code Online (Sandbox Code Playgroud)
我可以解决这个原始方程如下:
x = A \ b;
Run Code Online (Sandbox Code Playgroud)
如果我想要一个独特的解决方案,我可以在计算非唯一解决方案后施加一个约束(比如,x(4)== 3.14159):
x = x - x(4) + 3.14159;
Run Code Online (Sandbox Code Playgroud)
我可以C
通过添加一个额外的唯一性约束来创建一个新的全秩矩阵,如下所示:
% Add the constraint x(4) == 3.14159
extraRow = zeros(1,m);
extraRow(4) = 1.0;
C = [A; extraRow]; % Add to the matrix A
d = [b; 3.14159]; % Add to the RHS vector, …
Run Code Online (Sandbox Code Playgroud) 如何写一个(英特尔)F90函数将字符串转换为小写(或者,大写)?我想将一个字符数组传递给函数并让它返回一个字符数组,例如
program main
implicit none
character*32 :: origStr = "Hello, World!"
character*32 :: newStr
newStr = to_lower(origStr)
write (*,*) newStr
end program main
Run Code Online (Sandbox Code Playgroud)
这样程序输出hello, world!
.
我一直to_lower()
在RosettaCode中找到的子程序开始,但我无法弄清楚如何将其作为函数编写.
提前致谢!
PS - 如果你能用一串不固定的长度做到这一点,你可以获得奖励积分!
Fortran有,stop
并且error stop
都过早地退出程序并且可以返回错误代码.
这两者之间有什么区别,什么时候应该使用?(另外,这里有实现/编译器问题吗?)
我从英特尔的文档中了解到stop
终止程序,但error stop
似乎做了一些.那个页面很有用,但并不能完全回答我的问题,因为1)它对我来说有点太技术了,2)我知道Fortran标准在实现中为"艺术表达"留下了空间,所以我不这样做相信该页面能够完美地反映标准.
我注意到这个问题与Fortran中"stop"和"exit"之间的区别有什么关系?- 事实上,我的问题是受到这个问题答案的启发.而这个问题问的区别stop
和exit
,我专门在看的基本事实的差异stop
和error stop
.回想起来,我的问题在这个问题上是一个有用的补充,但由于事实并非如此,这是一个单独的问题.
假设我希望以可移植的方式将一个双精度值写入 ASCII 文件,使其达到全精度。(显然,原始二进制输出是表达数字的最紧凑的方式,但这不是我在这里要问的。)
我想要另一个程序,例如用 MATLAB 或 Python 编写,能够读取文件并存储与 Fortran 程序内部相同的确切值。
默认的 ASCII 输出简单地完成如下:
program main
use, intrinsic :: ISO_FORTRAN_ENV, only : dp=>REAL64, stdout=>OUTPUT_UNIT
implicit none
real(kind=dp), parameter :: pi = 3.141592653589793238462643383279502884197_dp
write(stdout,*) pi ! Test the default format
write(stdout,'(f)') pi ! Test the specific decimal default format
write(stdout,'(f20.15)') pi ! Probably sufficient precision...
write(stdout,'(f30.20)') pi ! EXCESSIVE PRECISION!
end program main
Run Code Online (Sandbox Code Playgroud)
我知道不同的编译器可能有不同的格式默认值和要求。例如,ifort
编译上面的例子没有问题,并产生以下输出:
3.14159265358979
3.1415926535897931
3.141592653589793
3.14159265358979311600
Run Code Online (Sandbox Code Playgroud)
gfortran
(gcc version 4.8.2) 另一方面,第二个输出语句需要一个宽度,所以编译失败。注释掉第二个输出语句'(f)'
允许编译,结果(此处添加空行)为:
3.1415926535897931
3.141592653589793
3.14159265358979311600
Run Code Online (Sandbox Code Playgroud)
我无法访问nagfor …
据我所知,英特尔的Fortran编译器ifort
执行一些函数内联和过程间优化(IPO)以及其他标准优化.这可以在以下示例中完成:
ifort -O2 -finline-functions -ipo myProgram.f function.f subroutine.f -o MyProgram
Run Code Online (Sandbox Code Playgroud)
编译器选项说明:
-O2
标志告诉编译器执行重要的优化(对于Fortran,包括函数内联).-finline-functions
标志告诉编译器允许函数内联.(这是默认行为;为了显而易见,我在这里包含了标志.)-ipo
标志告诉编译器执行IPO.假设我将编译过程分解为两个步骤,就像使用Makefile时经常做的那样....
ifort -O2 -ipo -c function.f -o function.o
ifort -O2 -ipo -c subroutine.f -o subroutine.o
ifort -O2 -ipo -c myProgram.f -o myProgram.o
Run Code Online (Sandbox Code Playgroud)
(我猜这个步骤没有完成内联,因为文件是独立编译的....)
然后我将目标文件链接在一起并创建可执行文件:
ifort -O2 -finline-functions -ipo myProgram.o function.o subroutine.o -o MyProgram
如果我做单独编译的文件,这些优化标志的应传递给在阶段该编译器?在哪一步内联和IPO执行?
我正在尝试将球谐函数插值到立方笛卡尔网格。
我的球面伪光谱模拟的输出数据的Nr
径向水平介于rMin
和之间rMax
,每个水平包含一组经度和纬度的有限阶球谐函数。球谐函数通过三角截断映射到包含Ni
经度和纬度的物理球面网格Nj
。
域如下:
rMin <= r(k) <= rMax
,带有索引1 <= k <= Nr
Nm = (Nj-1)/3
0 <= m <= Nm
m <= l <= Nm
nlm == (nm+1)*(nm+2)/2
(的总数l
,m
组合)数据数组:
complex*16, dimension( 1:nlm, 1:Nr ) :: foo_spectral
real*8, dimension( 1:Nx, 1:Ny, 1:Nz ) :: foo_cartesian
我正在寻找一种准确,有效的方法,将数据从其频谱表示形式插值到具有边长的立方笛卡尔网格中2*rMax
,以使球形域完全适合内部。但是,我只想在球体内进行插值:对于与r<rMin
或对应的点rMax<r
,三次方网格应具有OUTSIDE_DOMAIN
值。
目前,我必须将数据从其频谱表示形式(球面谐波:)foo(Nr,nlm)
转换为物理表示形式(球面网格 …
该.bash_history
文件是我们许多人的生命保存.不幸的是,BASH似乎只在该会话关闭(通过exit
)时保存会话的命令.
这是一个悲剧,然后,当一个重要会话的所有命令在一个会话意外关闭时被蒸发 - 在它使用花哨的语法归档所有命令之前需要数小时才能正确...
当我忘记在离开工作时忘记关闭SSH连接,并且由于不活动(Write failed: broken pipe
)而导致断开连接,或者当我重新启动计算机而没有手动关闭终端时,这种情况发生在我身上,等等.
我希望在一段时间之后将我的BASH命令存档 - 比如说每10分钟 - 这样如果我关闭一个会话,我的命令仍然会存在.这似乎是很多人可能觉得有用的东西.
有没有人知道如何做到这一点?
理想的情况下....
~/.bashrc
bash
或其他"黑客"StackOverflow- ers - 认为自己受到挑战!
假设我有一个子程序:
subroutine foo(x, Nx)
implicit none
integer, intent(IN) :: x
integer, intent(IN) :: Nx
select case(x)
case (1)
write(*,*) "Minimum value"
case (Nx)
write(*,*) "Maximum value"
case default
write(*,*) "Somewhere in-between"
end select
end subroutine foo
Run Code Online (Sandbox Code Playgroud)
假设我的驱动程序看起来像这样:
program main
implicit none
interface
subroutine foo(x,Nx)
integer, intent(IN) :: x
integer, intent(IN) :: Nx
end subroutine foo
end interface
integer, parameter :: Nx = 100
integer :: x
call foo(20, Nx)
end program main
Run Code Online (Sandbox Code Playgroud)
以上程序不会编译,因为在子程序中,case (Nx)
无效.具体来说,ifort 16给出以下错误:
错误#6601:在CASE语句中,case-value必须是常量表达式.
换句话说,即使Nx被有效地 …
我尝试向此模块添加一个由@VladimirF编写的过程,该过程在 Fortran 2003 中实现通用链表。为了方便起见,我希望能够将列表的内容作为数组输出,因此我将以下过程添加到列出名为的文件中的模块lists.f90
:
subroutine list_as_array(self, arrayOut)
class(list),intent(inout) :: self
class(*),dimension(1:self%length),intent(out) :: arrayOut
integer :: i
type(list_node), pointer :: nodeIter
nodeIter = self%first
do i = 1,self%length
arrayOut(i) = nodeIter%item ! <---ERROR here
if (i<self%length) then
nodeIter = nodeIter%next
end if
end do
end subroutine list_as_array
Run Code Online (Sandbox Code Playgroud)
ifort 18.0.0
给出以下错误:
lists.f90(324): error #8304: In an intrinsic assignment statement, variable shall not be a non-allocatable polymorphic. [ARRAYOUT]
arrayOut(i) = nodeIter%item
------^
Run Code Online (Sandbox Code Playgroud)
我对 F2003+ 中的多态性不熟悉,所以我不理解错误消息或其上下文。出了什么问题,如何修复?
fortran ×8
matlab ×2
ascii ×1
bash ×1
compilation ×1
derivative ×1
formatting ×1
fortran90 ×1
function ×1
history ×1
makefile ×1
optimization ×1
parameters ×1
polymorphism ×1
portability ×1
precision ×1
qhull ×1
scripting ×1
select-case ×1
shell ×1
spectral ×1
string ×1
suitesparse ×1